À quoi sert la variable 'cls' dans les classes Python?

270

Pourquoi est-il clsparfois utilisé au lieu de selfcomme argument dans les classes Python?

Par exemple:

class Person:
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    @classmethod
    def from_fullname(cls, fullname):
        cls.firstname, cls.lastname = fullname.split(' ', 1)
Scaraffe
la source

Réponses:

293

La distinction entre "self"et "cls"est définie dans PEP 8. Comme l'a dit Adrien, ce n'est pas obligatoire. C'est un style de codage. PEP 8dit:

Arguments de la fonction et de la méthode :

Utilisez toujours selfpour le premier argument les méthodes d'instance.

Utilisez toujours clsle premier argument pour les méthodes de classe.

Baskaya
la source
56

Il est utilisé dans le cas d'une méthode de classe. Vérifiez cette référence pour plus de détails.

EDIT: Comme clarifié par Adrien, c'est une convention. Vous pouvez réellement utiliser n'importe quoi mais clset selfêtes utilisé ( PEP8 ).

Juho Vepsäläinen
la source
52

clsimplique que la méthode appartient à la classe tandis que self implique que la méthode est liée à l'instance de la classe, donc le membre avec clsest accessible par le nom de la classe alors que celui avec self est accessible par l'instance de la classe ... c'est le même concept comme static memberet non-static membersen java si vous êtes d'origine java.

abdilatif bashir
la source
1
Merci pour la référence Java, comprenez maintenant.
Edenshaw
Que vous pour la mention static memberet non-static members, compris dans le contexte de c ++
Amit JS
18

C'est une très bonne question, mais pas autant que la question. Il y a une différence entre la méthode utilisée par «soi» et «cls» bien que, analogiquement, elles soient au même endroit

def moon(self, moon_name):
    self.MName = moon_name

#but here cls method its use is different 

@classmethod
def moon(cls, moon_name):
    instance = cls()
    instance.MName = moon_name

Vous pouvez maintenant voir que les deux sont la fonction de la lune, mais l'une peut être utilisée à l'intérieur de la classe tandis que l'autre nom de la fonction lune peut être utilisé pour n'importe quelle classe.

Pour une approche de programmation pratique:

Lors de la conception d'une classe de cercle, nous utilisons la méthode area comme cls au lieu de self car nous ne voulons pas que area soit limitée à une classe particulière de cercle uniquement.

L'Exorciste
la source
si vous souhaitez ajouter quelque chose de plus que les codeurs recherchent, le cas échéant, l'approuvera.
TheExorcist
2

Au lieu d'accepter un paramètre auto, les méthodes de classe prennent un paramètre cls qui pointe vers la classe - et non l' instance d'objet - lorsque la méthode est appelée. Étant donné que la méthode de classe n'a accès qu'à cet argument cls, elle ne peut pas modifier l'état d'instance d'objet . Cela nécessiterait un accès à soi-même. Cependant, les méthodes de classe peuvent toujours modifier l'état de classe qui s'applique à toutes les instances de la classe.

- Astuces Python

authentichigh
la source