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

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

РЕДАКТИРОВАТЬ: Как выяснил Адриен, это соглашение. На самом деле вы можете использовать все что угодно, но 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.