Как я могу объявить статический атрибут в Python?
Здесь написано, как я могу объявить метод: Статические методы в Python?
Как я могу объявить статический атрибут в Python?
Здесь написано, как я могу объявить метод: Статические методы в Python?
Все переменные, определенные на уровне класса в Python, считаются статическими
class Example:
Variable = 2 # static variable
print Example.Variable # prints 2 (static variable)
# Access through an instance
instance = Example()
print instance.Variable # still 2 (ordinary variable)
# Change within an instance
instance.Variable = 3 #(ordinary variable)
print instance.Variable # 3 (ordinary variable)
print Example.Variable # 2 (static variable)
# Change through Class
Example.Variable = 5 #(static variable)
print instance.Variable # 3 (ordinary variable)
print Example.Variable # 5 (static variable)
Вы можете иметь две разные переменные в своем классе под тем же именем (один статический и один обычный). Не путайте.
Все переменные, объявленные внутри тела класса, являются "статическими" атрибутами.
class SomeClass:
# this is a class attribute
some_attr = 1
def __init__(self):
# this is an instance attribute
self.new_attr = 2
Но имейте в виду, что "статическая" часть согласуется, а не навязывается (более подробно об этом читайте этот поток SO).
Более подробную информацию об этом соглашении и его последствиях см. в краткой выдержке из официальной документации :
"Private" переменные экземпляра, к которым нельзя получить доступ, за исключением внутри объекта, не существует в Python. Однако существует, за которым следует большинство кода Python: имя, префиксное подчеркивание (например, _spam) следует рассматривать как непубличную часть API (будь то функция, метод или элемент данных). Это следует рассматривать как деталь реализации и подлежит изменению без уведомления.
Поскольку существует действительный прецедент для членов класса и частного лица (а именно: избегайте совпадений имен имен с именами, определенными подклассами), там ограниченная поддержка такого механизма, называемого "mangling". Любые идентификатор формы __spam (по крайней мере два ведущих подчеркивания, при самый последний символ подчеркивания) заменяется на текст _classname__spam, где classname - это текущее имя класса с разделительными подчеркиваниями. Это манипулирование выполняется безотносительно к синтаксическому положению идентификатора, если это происходит в определении класса.
статические атрибуты атрибуты данных в python. так что атрибуты, назначенные в классе: -
>>>class A(object):
>>> a = 1
>>>A.a
>>>1
Это отличается от С++ и Java, в которых статический член не может быть доступен с помощью экземпляра: -
>>>inst = A()
>>>inst.a
1
>>>
также встроенный метод setattr
поможет вам установить static variable(data attribute)
.
>>>setattr(A, 'b', 2)
>>>A.b
>>>inst.b
Чтобы добавить к нему, у вас также могут быть статические переменные, а не только классы:
def some_fun():
some_fun.i += 1
print(some_fun.i)
some_fun.i = 0;
print(some_fun(), some_fun(), some_fun())
# prints: 1,2,3
Вы можете использовать стандартный декоратор @property для создания статического атрибута:
class A(object):
@property
def a(self):
return 1
a = A()
print a.a
1
a.a = 2
AttributeError: can't set attribute