Wofür wird die Variable 'cls' in Python-Klassen verwendet?

270

Warum wird in Python-Klassen clsmanchmal statt selfals Argument verwendet?

Beispielsweise:

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
quelle

Antworten:

293

Die Unterscheidung zwischen "self"und "cls"ist definiert in PEP 8. Wie Adrien sagte, ist dies nicht obligatorisch. Es ist ein Codierungsstil. PEP 8sagt:

Funktions- und Methodenargumente :

Verwenden Sie immer selffür das erste Argument Instanzmethoden.

Verwenden Sie immer clsfür das erste Argument Klassenmethoden.

Baskaya
quelle
56

Es wird im Fall einer Klassenmethode verwendet. Überprüfen Sie diese Referenz für weitere Details.

EDIT: Wie von Adrien klargestellt, ist es eine Konvention. Sie können tatsächlich alles andere als verwenden clsund selfwerden verwendet ( PEP8 ).

Juho Vepsäläinen
quelle
51

clsimpliziert, dass die Methode zur Klasse gehört, während self impliziert, dass die Methode mit der Instanz der Klasse zusammenhängt, daher wird auf das Mitglied mit über den Klassennamen clszugegriffen, während auf das Mitglied mit self über die Instanz der Klasse zugegriffen wird ... es ist dasselbe Konzept als static memberund non-static membersin Java, wenn Sie aus Java-Hintergrund sind.

abdilatif bashir
quelle
Vielen Dank für die Java-Referenz, jetzt verstehen.
Edenshaw
Als Sie für die Erwähnung static memberund non-static membersverstanden es im Zusammenhang mit c ++
Amit JS
18

Dies ist eine sehr gute Frage, aber nicht so wollen wie eine Frage. Es gibt einen Unterschied zwischen der verwendeten Methode 'self' und 'cls', obwohl sie sich analog an derselben Stelle befinden

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

Jetzt können Sie sehen, dass beide Mondfunktionen sind, aber eine kann innerhalb der Klasse verwendet werden, während der andere Funktionsname Mond für jede Klasse verwendet werden kann.

Für den praktischen Programmieransatz:

Beim Entwerfen der Kreisklasse verwenden wir die Bereichsmethode als cls anstelle von self, da der Bereich nicht nur auf eine bestimmte Kreisklasse beschränkt werden soll.

Der Exorzist
quelle
Wenn Sie etwas hinzufügen möchten, das von den Codierern gesucht wird, wird es genehmigt, wenn dies richtig ist.
TheExorcist
2

Anstatt einen Selbstparameter zu akzeptieren, verwenden Klassenmethoden einen cls- Parameter, der auf die Klasse und nicht auf die Objektinstanz verweist, wenn die Methode aufgerufen wird. Da die Klassenmethode nur Zugriff auf dieses cls-Argument hat, kann sie den Status der Objektinstanz nicht ändern . Das würde den Zugang zu sich selbst erfordern. Klassenmethoden können jedoch weiterhin den Klassenstatus ändern, der für alle Instanzen der Klasse gilt.

- Python-Tricks

authentichigh
quelle