Python sınıflarında kullanılan 'cls' değişkeni nedir?


270

Neden clsbazen selfPython sınıflarında argüman olarak kullanılmıyor ?

Örneğin:

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)

Yanıtlar:


293

Arasındaki fark "self"ve "cls"tanımlanmıştır PEP 8. Adrien'ın dediği gibi, bu zorunlu değildir. Bu bir kodlama tarzı. PEP 8diyor:

İşlev ve yöntem bağımsız değişkenleri :

selfÖrnek yöntemlerine her zaman ilk argüman için kullanın .

clsSınıf yöntemlerine her zaman ilk argüman için kullanın .


56

Bir sınıf yöntemi durumunda kullanılır. Kontrol bu başvuruyu daha detaylı bilgi için.

EDIT: Adrien tarafından açıklandığı gibi, bu bir kongre. Aslında her şeyi kullanabilirsiniz clsve selfkullanılır ( PEP8 ).


52

clskendi kendine yöntemin sınıf örneğiyle ilişkili olduğunu ima ederken, yöntemin sınıfa ait olduğunu ima eder, bu nedenle üyeye clssınıf adıyla erişilir, burada öz olana sınıf örneği ile erişilir ... aynı kavramdır olarak static memberve non-static membersjava java arka plandan ise.


1
Java referansınız için teşekkür ederiz, şimdi anlayın.
Edenshaw

Sizden bahsettiğiniz için static memberve non-static membersc ++ bağlamında anladım
Amit JS

18

Bu çok iyi bir soru ama soru kadar istemiyor. Analog olarak aynı yerde olmalarına rağmen 'self' ve 'cls' kullanılan yöntem arasında fark vardır.

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

Artık her ikisinin de ay işlevi olduğunu görebilirsiniz ancak biri sınıf içinde kullanılabilirken diğer işlev adı moon herhangi bir sınıf için kullanılabilir.

Pratik programlama yaklaşımı için:

Circle sınıfı tasarlarken, alan yöntemini kendi yerine cls olarak kullanırız çünkü alanın sadece belirli sınıf sınıfı ile sınırlı olmasını istemiyoruz.


hangi kodlayıcıların aradığını daha doğru bir şekilde eklemek isterseniz, doğru ise onaylar.
TheExorcist

2

Bir self parametresini kabul etmek yerine sınıf yöntemleri , yöntem çağrıldığında sınıfa ( nesne örneğine değil) işaret eden bir cls parametresi alır . Sınıf yöntemi yalnızca bu cls bağımsız değişkenine erişime sahip olduğundan, nesne örneği durumunu değiştiremez . Bu kendine erişim gerektirir. Ancak, sınıf yöntemleri yine de sınıfın tüm örnekleri için geçerli olan sınıf durumunu değiştirebilir.

- Python Hileleri

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.