Méthodes d'instance
Lors de la création d'une méthode d'instance, le premier paramètre est toujours self
. Vous pouvez lui donner le nom que vous voulez, mais la signification sera toujours la même, et vous devez utiliser self
puisque c'est la convention d'appellation. self
est (généralement) transmis de manière cachée lors de l'appel d'une méthode d'instance ; il représente l'instance qui appelle la méthode.
Voici un exemple de classe appelée Inst
qui possède une méthode d'instance appelée introduce()
:
class Inst:
def __init__(self, name):
self.name = name
def introduce(self):
print("Hello, I am %s, and my name is " %(self, self.name))
Pour appeler cette méthode, nous devons d'abord créer une instance de notre classe. Une fois que nous avons une instance, nous pouvons appeler introduce()
et l'instance sera automatiquement transmise en tant que self
:
myinst = Inst("Test Instance")
otherinst = Inst("An other instance")
myinst.introduce()
# outputs: Hello, I am <Inst object at x>, and my name is Test Instance
otherinst.introduce()
# outputs: Hello, I am <Inst object at y>, and my name is An other instance
Comme vous le voyez, nous ne passons pas le paramètre self
. Il est transmis de manière cachée avec l'opérateur point. Nous appelons Inst
la méthode d'instance de la classe introduce
avec le paramètre de myinst
ou otherinst
. Cela signifie que nous pouvons appeler Inst.introduce(myinst)
et obtenir exactement le même résultat.
Méthodes de classe
L'idée d'une méthode de classe est très similaire à celle d'une méthode d'instance, à la seule différence qu'au lieu de passer l'instance de manière cachée comme premier paramètre, nous passons la classe elle-même comme premier paramètre.
class Cls:
@classmethod
def introduce(cls):
print("Hello, I am %s!" %cls)
Comme nous ne transmettons qu'une classe à la méthode, aucune instance n'est impliquée.
Cela signifie que nous n'avons pas besoin d'une instance et que nous appelons la méthode de la classe comme s'il s'agissait d'une fonction statique :
Cls.introduce() # same as Cls.introduce(Cls)
# outputs: Hello, I am <class 'Cls'>
Remarquez à nouveau que Cls
est transmis de manière cachée, nous pourrions donc également dire Cls.introduce(Inst)
et obtenir le résultat "Hello, I am <class 'Inst'>
.
Ceci est particulièrement utile lorsque nous héritons d'une classe de Cls
:
class SubCls(Cls):
pass
SubCls.introduce()
# outputs: Hello, I am <class 'SubCls'>