Подтвердить что ты не робот

Как объявить статический атрибут в Python?

Как я могу объявить статический атрибут в Python?

Здесь написано, как я могу объявить метод: Статические методы в Python?

4b9b3361

Ответ 1

Все переменные, определенные на уровне класса в 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)

Вы можете иметь две разные переменные в своем классе под тем же именем (один статический и один обычный). Не путайте.

Ответ 2

Все переменные, объявленные внутри тела класса, являются "статическими" атрибутами.

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 - это текущее имя класса с разделительными подчеркиваниями. Это манипулирование выполняется безотносительно к синтаксическому положению идентификатора, если это происходит в определении класса.

Ответ 3

статические атрибуты атрибуты данных в 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

Ответ 4

Чтобы добавить к нему, у вас также могут быть статические переменные, а не только классы:

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  

Ответ 5

Вы можете использовать стандартный декоратор @property для создания статического атрибута:

class A(object):
    @property
    def a(self):
        return 1

a = A()
print a.a

1

a.a = 2

AttributeError: can't set attribute