84 votes

Différence entre les méthodes de classe et d'instance

Je lisais PEP 8 ( guide de style ), et j'ai remarqué qu'il suggérait d'utiliser soi comme premier argument d'une méthode d'instance, mais cls comme premier argument d'une méthode de classe.

J'ai utilisé et écrit quelques classes, mais je n'ai jamais rencontré de méthode de classe (enfin, une méthode qui passe par cls comme paramètre). Quels sont les exemples ?

128voto

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'>

2voto

Despereaux Points 53

Une méthode d'instance, pour faire simple, est une fonction définie à l'intérieur d'une classe. Elle varie en fonction des différentes instances de la classe. Exemple de méthode d'instance :

class Dog:
    def __init__(self, sound):
        self.sound = sound
    def bark(self):
        return f"The dog makes the sound: {self.sound}"

Alors qu'une méthode de classe est une méthode qui, contrairement à la méthode bark(), s'applique à toutes les instances de la classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X