Для чего используется переменная 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)
Scaraffe
источник

Ответы:

293

Различие между "self"и "cls"определено в PEP 8. Как сказал Адриен, это не обязательно. Это стиль кодирования. PEP 8говорит:

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

Всегда используйте self в качестве первого аргумента методы экземпляра.

Всегда используйте clsв качестве первого аргумента для методов класса.

Баскайа
источник
56

Используется в случае метода класса. Проверьте эту ссылку для получения дополнительной информации.

РЕДАКТИРОВАТЬ: Как выяснил Адриен, это соглашение. На самом деле вы можете использовать все что угодно, но clsи selfиспользуются ( PEP8 ).

Юхо Вепсяляйнен
источник
52

clsподразумевает, что метод принадлежит классу, в то время как self подразумевает, что метод связан с экземпляром класса, поэтому к элементу с clsобращаются по имени класса, тогда как к элементу с самим собой обращается экземпляр класса ... это та же самая концепция как static memberи non-static membersв Java, если вы из происхождения Java.

Абдилатиф Башир
источник
1
Спасибо за ссылку на Java, теперь понимаю.
Edenshaw
Чем вы за упоминание 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

Теперь вы можете видеть обе функции луны, но одну можно использовать внутри класса, в то время как другую функцию с именем moon можно использовать для любого класса.

Для практического подхода к программированию:

При разработке класса круга мы используем метод area как cls вместо self, потому что мы не хотим, чтобы область была ограничена только определенным классом круга.

Экзорцист
источник
если вы хотите добавить что-то еще, что ищет кодировщик, если это правильно, одобрит это.
TheExorcist
2

Вместо того, чтобы принимать собственный параметр, методы класса принимают параметр cls, который указывает на класс - а не на экземпляр объекта - при вызове метода. Поскольку метод класса имеет доступ только к этому аргументу cls, он не может изменять состояние экземпляра объекта . Это потребует доступа к себе. Однако методы класса могут по-прежнему изменять состояние класса, которое применяется ко всем экземплярам класса.

- Python Tricks

authentichigh
источник