Так же, как self используется для доступа к атрибуту внутри самого объекта (класса).
Не внутри объекта / класса, а только внутри класса * методы экземпляра .self
- это просто соглашение, вы можете называть его как угодно, даже по-разному в каждом методе.
Так что, если вы не добавили префикс переменной self в методе класса, вы быне сможет получить доступ к этой переменной в других методах класса или за его пределами.
self
используется в методах экземпляра , cls
часто используется в методах класса .В противном случае исправьте.
Таким образом, вы можете опустить его, если хотите сделать переменную локальной только для этого метода.
Да, внутри метода имя переменной похоже навнутри любой другой функции - интерпретатор ищет имя локально, затем в замыканиях, затем на уровне глобалов / модулей, затем во встроенных модулях Python.
Точно так же, если у вас былометода, и у вас не было никакой переменной, которую вы хотели бы передать другим методам, вы можете опустить self в аргументах метода.
Нет, вы не можете просто опустить "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