Ответ 1
Точно так же self используется для доступа к атрибуту внутри самого объекта (класса).
Не внутри объекта/класса, просто внутри методов экземпляра класса. self
- это просто соглашение, вы можете называть его любым, что вы хотели, даже что-то другое в каждом методе.
Итак, если вы не префикс переменной с self в методе класса, вы не сможете получить доступ к этой переменной в других методах класса или вне класса.
self
используется в методах экземпляра, cls
часто используется в методах класса. В противном случае, исправьте.
Таким образом, вы можете опустить это, если хотите сделать переменную local только для этого метода.
Да, внутри метода имя переменной похоже на любую другую функцию - интерпретатор ищет имя локально, затем в закрытии, затем на уровне глобалов/модулей, затем в встроенных встроенных Python.
Точно так же, если у вас есть метод, и у вас нет какой-либо переменной, которую вы хотели бы поделиться с другими методами, вы можете опустить self из аргументов метода.
Нет, вы не можете просто опустить "я" из аргументов метода. Вы должны сказать Python, что хотите staticmethod
, который не получит автоматически экземпляр класса, ether, выполнив @staticmethod
над строкой def
или mymethod = staticmethod(mymethod)
под телом метода.
Каждый экземпляр создает свою собственную "копию" атрибутов, поэтому, если вы хотите, чтобы все экземпляры класса использовали одну и ту же переменную, вы должны префикс этого имени переменной с помощью "cls" в объявлении класса.
Внутри определения класса, но вне любых методов, имена привязаны к классу - то, как вы определяете методы и т.д. Вы не префикс их cls
или что-либо еще.
cls
обычно используется в __new__
special staticmethod
или в classmethod
s, который вы делаете аналогично staticmethod
s. Это методы, которым нужен только доступ к классу, но не к вещам, специфичным для каждого экземпляра класса.
Внутри classmethod
, да, вы должны использовать это, чтобы ссылаться на атрибуты, которые хотели бы использовать для всех экземпляров класса и самого класса.
Подобно self
, cls
- это просто соглашение, и вы можете называть его любым, что вы хотели.
Краткий пример:
class Foo(object):
# you couldn't use self. or cls. out here, they wouldn't mean anything
# this is a class attribute
thing = 'athing'
def __init__(self, bar):
# I want other methods called on this instance of Foo
# to have access to bar, so I create an attribute of self
# pointing to it
self.bar = bar
@staticmethod
def default_foo():
# static methods are often used as alternate constructors,
# since they don't need access to any part of the class
# if the method doesn't have anything at all to do with the class
# just use a module level function
return Foo('baz')
@classmethod
def two_things(cls):
# can access class attributes, like thing
# but not instance attributes, like bar
print cls.thing, cls.thing