Python - я, нет я и cls
Еще один вопрос о том, для чего предназначено "я", что произойдет, если вы не используете "я" и для чего "cls". Я "сделал свою домашнюю работу", я просто хочу убедиться, что я получил все это.
self
- Чтобы получить доступ к атрибуту объекта, необходимо добавить к имени атрибута имя объекта (objname.attributename
). Так же self
используется для доступа к атрибуту внутри самого объекта (класса). Поэтому, если вы не добавили префикс к себе в метод класса, вы не смогли бы получить доступ к этой переменной в других методах класса или за его пределами. Таким образом, вы можете опустить его, если хотите сделать переменную локальной только для этого метода. Точно так же, если у вас есть метод, и у вас нет переменной, которую вы хотите передать другим методам, вы можете опустить self
из аргументов метода.
cls
- Каждый экземпляр создает свою собственную "копию" атрибутов, поэтому, если вы хотите, чтобы все экземпляры класса совместно использовали одну и ту же переменную, вы бы добавили префикс имени этой переменной к 'cls
'в объявлении класса.
Это все в порядке? Благодарю.
2 ответа
Таким же образом self используется для доступа к атрибуту внутри самого объекта (класса).
Не внутри объекта / класса, а только внутри методов экземпляра класса. self
это просто соглашение, вы можете назвать его как угодно, даже по-разному в каждом методе.
Поэтому, если вы не добавили префикс к себе в метод класса, вы не смогли бы получить доступ к этой переменной в других методах класса или за его пределами.
self
используется в методах экземпляра, cls
часто используется в методах класса. В противном случае исправить.
Таким образом, вы можете опустить его, если хотите сделать переменную локальной только для этого метода.
Да, внутри метода имя переменной такое же, как и внутри любой другой функции - интерпретатор ищет имя локально, затем в замыканиях, затем на уровне глобалов / модулей, а затем во встроенных модулях Python.
Точно так же, если у вас есть метод и у вас нет какой-либо переменной, которую вы хотите передать другим методам, вы можете опустить self в аргументах метода.
Нет, вы не можете просто опустить "self" в аргументах метода. Вы должны сказать Python, что вы хотите staticmethod
, который не будет автоматически передан экземпляру класса, эфир, выполнив @staticmethod
выше def
линия или mymethod = staticmethod(mymethod)
ниже тела метода.
Каждый экземпляр создает свою собственную "копию" атрибутов, поэтому, если вы хотите, чтобы все экземпляры класса совместно использовали одну и ту же переменную, вы должны поставить префикс этого имени переменной с "cls" в объявлении класса.
Внутри определения класса, но вне каких-либо методов, имена привязаны к классу - так вы определяете методы и т. Д. cls
или что-нибудь еще.
cls
обычно используется в __new__
специальный staticmethod
или в classmethod
с, которые вы делаете аналогично 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
Ты используешь self
в качестве первого аргумента в обычных методах, где экземпляр автоматически передается через этот аргумент. Поэтому, какой бы ни был первый аргумент в методе - он указывает на текущий экземпляр
Когда метод украшен @classmethod
он получает класс, переданный в качестве первого аргумента, поэтому наиболее распространенное имя для него cls
как это указывает на класс.
Вы обычно не ставите префикс перед любой переменной (венгерская запись плохая).
Вот пример:
class Test(object):
def hello(self):
print 'instance %r says hello' % self
@classmethod
def greet(cls):
print 'class %r greet you' % cls
Выход:
>>> Test().hello()
instance <__main__.Test object at 0x1f19650> says hello
>>> Test.greet()
class <class '__main__.Test'> greet you