Для чого використовується змінна 'cls' у класах Python?


270

Чому clsіноді використовується selfяк аргумент як в класах Python?

Наприклад:

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)

Відповіді:


293

Відмінність між "self"і "cls"визначається в PEP 8. Як сказав Адрієн, це не є обов'язковим. Це стиль кодування. PEP 8каже:

Аргументи функції та методу :

Завжди використовуйте selfдля першого аргументу методи екземпляра.

Завжди використовуйте clsдля першого аргументу методи класу.


56

Він використовується у випадку класового методу. Перегляньте це посилання для отримання додаткової інформації.

EDIT: Як уточнив Адрієн, це конвенція. Ви можете використовувати що - або , але clsі selfвикористовуються ( PEP8 ).


52

clsМає на увазі, що метод належить до класу, тоді як self означає, що метод пов'язаний з екземпляром класу, тому член з clsдоступом до імені класу має місце, де, як той, хто має self, має доступ до екземпляра класу ... це та сама концепція як static memberі non-static membersв java, якщо ви з java background.


1
Дякую за посилання на Java, тепер зрозумійте.
Еденшо

Чим ви за згадування, static memberі non-static membersзрозуміли це в контексті c ++
Amit JS

18

Це дуже гарне запитання, але не так хочеться, як питання. Існує різниця між методом "self" і "cls", хоча аналогічно вони знаходяться на одному місці

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

Тепер ви можете бачити, що обидві є функцією місяця, але одна може бути використана всередині класу, а інша назва місяця може використовуватися для будь-якого класу.

Для практичного підходу до програмування:

Під час проектування класу кола ми використовуємо метод області як cls замість self, оскільки ми не хочемо, щоб область була обмежена лише певним класом кола.


якщо ви хочете додати щось більше, що шукають кодери, якщо правильно, це схвалить.
TheExorcist

2

Замість того, щоб приймати параметр self, методи класу беруть параметр cls, який вказує на клас - а не на об'єкт-екземпляр -, коли метод викликається. Оскільки метод класу має доступ лише до цього аргументу cls, він не може змінювати стан екземпляра об'єкта . Це вимагало б доступу до себе. Однак методи класу все ще можуть змінювати стан класу, який застосовується для всіх примірників класу.

- фокуси Пітона

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.