Что такое переменная cls, используемая в классах Python?
Почему вместо self
используется cls
в качестве аргумента в классах 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)
Ответы
Ответ 1
Различие между "self"
и "cls"
определено в PEP 8
. Как сказал Адриен, это не обязательно. Это стиль кодирования. PEP 8
говорит:
Аргументы функции и метода:
Всегда используйте self
для первого аргумента для методов экземпляра.
Всегда используйте cls
для первого аргумента для методов класса.
Ответ 2
Он используется в случае метода класса. Подробнее см. эту ссылку.
EDIT: Как пояснил Адриен, это соглашение. Фактически вы можете использовать что-либо, кроме cls
и self
(PEP8).
Ответ 3
cls
подразумевает, что метод принадлежит классу, в то время как self подразумевает, что метод связан с экземпляром класса, поэтому член с cls
доступен по имени класса, а к элементу с self - экземпляр класса... Это та же концепция, что и static member
и non-static members
в Java, если вы из Java.
Ответ 4
Это очень хороший вопрос, но не такой как вопрос.
Существует разница между используемым методом "self" и "cls", хотя аналогично они находятся в одном и том же месте.
def moon(self,moon_name):
self.MName =moon_name
#but here cls method its use is different
def moon(cls,moon_name):
instance=cls()
instance.MName=moon_name
Теперь вы можете видеть, что обе функции луны, но можно использовать внутри класса, тогда как другое имя функции moon может использоваться для любого класса.
Для практического подхода к программированию:
При разработке класса окружения мы используем метод area как cls вместо self, потому что мы не хотим, чтобы область была ограничена только определенным классом круга.
Ответ 5
Вместо того, чтобы принимать собственный параметр, методы класса принимают параметр cls, который указывает на класс, а не на экземпляр объекта, когда
метод называется.
Поскольку метод класса имеет доступ только к этому аргументу cls, он не может
изменить состояние экземпляра объекта. Это потребует доступа к себе. How-
методы класса все еще могут изменять состояние класса, которое применяется ко всем
экземпляры класса.
Кредит на книгу "Python Tricks"