Я хотел бы добавить что-то к ответам, которые я прочитал в этой теме и в этой теме (которая ссылается на эту).
Отказ от ответственности : это замечание пришло из экспериментов, которые я провел
Переменные вне __init__
:
Это, на самом деле, статические переменные класса , и, следовательно, они доступны для всех экземпляров класса.
Переменные внутри __init__
:
Значение этих переменных экземпляра доступно только для имеющегося экземпляра (через ссылку self
)
Мой вклад :
Одна вещь, которую программисты должны учитывать при использовании статических переменных класса , это то, что они могут быть затенены переменными экземпляра (если вы обращаетесь к статическим переменным класса через ссылку self
).
Объяснение
Раньше я думал, что оба способа объявления переменных были абсолютно одинаковыми (глупый я), и это было отчасти потому, что я мог получить доступ к обоим видам переменных через ссылку self
. Именно сейчас, когда я столкнулся с проблемой, я исследовал эту тему и прояснил ее.
Проблема с доступом к статическим переменным класса через
Ссылка self
состоит в том, что она ссылается на переменную статического класса только в том случае, если нет переменной экземпляра с тем же именем, и, что еще хуже, пытается переопределить static переменная класса через ссылку self
не работает, потому что создается переменная экземпляра , которая затем затеняет ранее доступную статическую переменную класса .
Чтобы обойти эту проблему, вы всегда должны ссылаться на статические переменные класса через имя класса.
Пример
#!/usr/bin/env python
class Foo:
static_var = 'every instance has access'
def __init__(self,name):
self.instance_var = 'I am %s' % name
def printAll(self):
print 'self.instance_var = %s' % self.instance_var
print 'self.static_var = %s' % self.static_var
print 'Foo.static_var = %s' % Foo.static_var
f1 = Foo('f1')
f1.printAll()
f1.static_var = 'Shadowing static_var'
f1.printAll()
f2 = Foo('f2')
f2.printAll()
Foo.static_var = 'modified class'
f1.printAll()
f2.printAll()
выход
self.instance_var = I am f1
self.static_var = every instance has access
Foo.static_var = every instance has access
self.instance_var = I am f1
self.static_var = Shadowing static_var
Foo.static_var = every instance has access
self.instance_var = I am f2
self.static_var = every instance has access
Foo.static_var = every instance has access
self.instance_var = I am f1
self.static_var = Shadowing static_var
Foo.static_var = modified class
self.instance_var = I am f2
self.static_var = modified class
Foo.static_var = modified class
Надеюсь, это кому-нибудь пригодится