A cosa serve la variabile 'cls' usata nelle classi Python?


270

Perché è cls volte utilizzato anziché selfcome argomento nelle classi Python?

Per esempio:

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)

Risposte:


293

La distinzione tra "self"e "cls"è definita in PEP 8. Come ha detto Adrien, questo non è obbligatorio. È uno stile di codifica. PEP 8dice:

Argomenti di funzione e metodo :

Usa sempre self per il primo argomento i metodi di istanza.

Utilizzare sempre clsper il primo argomento i metodi di classe.


56

È usato nel caso di un metodo di classe. Controlla questo riferimento per ulteriori dettagli.

EDIT: Come chiarito da Adrien, è una convenzione. Puoi effettivamente usare qualsiasi cosa tranne clse selfsono usati ( PEP8 ).


52

clsimplica che il metodo appartiene alla classe mentre self implica che il metodo è correlato all'istanza della classe, quindi clssi accede al membro con il nome della classe dove come si accede a quello con sé dall'istanza della classe ... è lo stesso concetto come static membere non-static membersin Java se vieni da Java Background.


1
Grazie per il riferimento Java, ora capisci.
Edenshaw,

Di te per la menzione static membere non-static members, capito nel contesto di c ++
Amit JS

18

Questa è un'ottima domanda, ma non così voluta come una domanda. C'è differenza tra il metodo usato 'self' e 'cls' sebbene analogamente si trovino nello stesso posto

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

Ora puoi vedere che entrambi sono funzioni lunari, ma uno può essere usato all'interno della classe mentre l'altro nome luna può essere usato per qualsiasi classe.

Per un approccio di programmazione pratica:

Durante la progettazione di una classe circolare utilizziamo il metodo area come cls anziché self perché non vogliamo che l'area sia limitata a una particolare classe di cerchio.


se ti piace aggiungere qualcosa in più che i programmatori che cercano, se giusto, lo approveranno.
TheExorcist,

2

Invece di accettare un parametro autonomo, i metodi di classe accettano un parametro cls che punta alla classe, e non all'istanza dell'oggetto, quando viene chiamato il metodo. Poiché il metodo class ha accesso solo a questo argomento cls, non può modificare lo stato dell'istanza dell'oggetto . Ciò richiederebbe l'accesso a se stessi. Tuttavia, i metodi di classe possono comunque modificare lo stato della classe che si applica a tutte le istanze della classe.

- Trucchi Python

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.