Do czego służy zmienna „cls” w klasach Python?

270

Dlaczego clsczasami jest używany zamiast selfjako argument w klasach Python?

Na przykład:

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)
Szarfa
źródło

Odpowiedzi:

293

Różnica między "self"i "cls"jest zdefiniowana w PEP 8. Jak powiedział Adrien, nie jest to obowiązkowe. To styl kodowania. PEP 8mówi:

Argumenty funkcji i metody :

Zawsze używaj selfpierwszego argumentu do metod instancji.

Zawsze używaj clsjako pierwszego argumentu do metod klasowych.

Baskaya
źródło
56

Jest stosowany w przypadku metody klasowej. Sprawdź to odniesienie, aby uzyskać dodatkowe informacje.

EDYCJA: Jak wyjaśnił Adrien, jest to konwencja. Możesz właściwie używać cokolwiek oprócz clsi selfsą używane ( PEP8 ).

Juho Vepsäläinen
źródło
52

clsimplikuje, że metoda należy do klasy, podczas gdy ja implikuje, że metoda jest powiązana z instancją klasy, dlatego dostęp do elementu clsjest uzyskiwany według nazwy klasy, gdzie jako do osoby z ja dostępną jest instancja klasy ... jest to ta sama koncepcja jak static memberi non-static membersw java, jeśli pochodzisz z java.

abdilatif bashir
źródło
1
Dziękujemy za odniesienie do Java, teraz rozumiem.
Edenshaw
Dziękujemy za wzmiankę static memberi non-static memberszrozumiałem to w kontekście c ++
Amit JS
18

To bardzo dobre pytanie, ale nie tak pożądane jak pytanie. Istnieje różnica między stosowaną metodą „self” i „cls”, chociaż analogicznie są one w tym samym miejscu

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

Teraz możesz zobaczyć, że oba są funkcją księżyca, ale jedna może być używana w klasie, podczas gdy inna funkcja moon może być używana dla dowolnej klasy.

Dla praktycznego podejścia do programowania:

Projektując klasę koła, używamy metody pola jako cls zamiast siebie, ponieważ nie chcemy, aby obszar był ograniczony tylko do określonej klasy koła.

Egzorcysta
źródło
jeśli chcesz dodać coś jeszcze, czego szukają koderzy, jeśli to prawda, zatwierdzi to.
TheExorcist
2

Zamiast akceptować własny parametr, metody klas przyjmują parametr cls , który wskazuje klasę - a nie instancję obiektu - podczas wywoływania metody. Ponieważ metoda klasy ma dostęp tylko do tego argumentu cls, nie może modyfikować stanu instancji obiektu . To wymagałoby dostępu do siebie. Jednak metody klas mogą nadal modyfikować stan klasy, który ma zastosowanie we wszystkich instancjach klasy.

- Sztuczki w języku Python

autentichigh
źródło