Здесь вы можете использовать «переменную класса» и «переменную экземпляра», так как это обычный язык в python.
class Foo(object):
var1 = "I'm a class variable"
def __init__(self, var2):
self.var2 = var2 # var2 is an instance variable
Единственное правило обзорного вам действительно нужно знать, питон порядок поиска имен - «LEGB», для местного, ограждающего, Global и BUILTIN.
Переменная класса с областью var1
все еще нуждается в поиске по "get attribute", вы можете получить доступ только к этому значению Foo.var1
или self.var1
. Конечно, вы также можете получить доступ к нему в другом месте внутри блока определения класса, но это всего лишь пример использования из области «Локальный».
Когда вы видите self.var1
, вы не можете сразу узнать, является ли это экземпляром или переменной класса (и, фактически, если имя привязано к объекту вообще!). Вы только знаете, что атрибут get проверяется на самом объекте, прежде чем он будет опробован классом.
В самом деле, переменная экземпляра может теневой класс переменный с тем же именем:
>>> f1 = Foo(var2='f1_2')
>>> f2 = Foo(var2='f2_2')
>>> f2.var1
"I'm a class variable"
>>> f2.var1 = "Boom!" # this shadows the class variable
>>> f1.var1, Foo.var1, f2.var1 # but: the class variable still exists
("I'm a class variable", "I'm a class variable", 'Boom!')
>>> del f2.var1 # restores the name resolution on the Foo object
>>> f2.var1
"I'm a class variable"
мудрить, мы можем написать фантазии кода, который делает переменный класс ведет себя скорее как переменный экземпляр; примечательным примером являются «поля» ORM. Например, в Django вы можете определить целое поле в классе model, однако при поиске этого имени в экземпляре модели вы получите возвращаемое фактическое целое число (а не объект IntegerField
).
Если вы заинтересованы в этом расширенном использовании доступа к атрибутам, прочитайте на descriptor protocol.Для мирских классов вы можете смело игнорировать эти детали, но стоит знать, что обычное разрешение переменных экземпляра, а затем переменных класса имеет более низкий приоритет, чем любые дескрипторы, которые, возможно, были определены в классе.
В общем, вы не можете сказать. Но t тоже не имеет значения. – Daniel
Возможно, вы ищете ["9.3.5. Переменные класса и экземпляра"] (https://docs.python.org/2/tutorial/classes.html#class-and-instance-variables), который охватывает большую часть что вы просите. –
Как вы можете сказать, в каком контексте? Программно проверять его? Посмотрите на исходный код? –