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)

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.


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 ).


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.


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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.