如何在Python中声明静态属性?

时间:2014-12-15 09:41:45

标签: python class static attributes

如何在Python中声明静态属性?

这里写的是我如何声明一个方法: Static methods in Python?

5 个答案:

答案 0 :(得分:51)

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)

您的类中可以有两个不同的变量,名称相同(一个是静态的,一个是普通的)。 不要困惑。

答案 1 :(得分:11)

在Class'中声明的所有变量身体是静止的'属性。

class SomeClass:
    # this is a class attribute
    some_attr = 1

    def __init__(self):
        # this is an instance attribute
        self.new_attr = 2

但请记住,静态'静态'部分是按照惯例,而不是强制执行(有关详细信息,请阅读this SO thread)。

有关此约定及其含义的更多详细信息,请参阅official documentation的快速摘录:

  

除了来自之外无法访问的“私有”实例变量   在一个对象里面,在Python中不存在。但是,有一个   大多数Python代码后面的约定:前缀为的名称   下划线(例如_spam)应被视为非公开的一部分   API(无论是函数,方法还是数据成员)。它   应被视为实施细节,可能会有变化   没有通知。

     

由于类私有成员有一个有效的用例(即   避免名字冲突的名称与子类定义的名称,在那里   对这种机制的支持是有限的,称为名称修改。任何   形式__spam的标识符(至少两个前导下划线,at   大多数一个尾随下划线)在文本上被替换为   _classname__spam,其中classname是当前的类名,其中前导下划线被剥离。这种破坏是不加考虑的   到标识符的句法位置,只要它发生   在一个类的定义内。

答案 2 :(得分:6)

只是添加它,你也可以在函数中使用静态变量,而不仅仅是类:

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  

答案 3 :(得分:2)

python中的静态属性为data attributes。 以便在课堂上分配属性: -

>>>class A(object):
>>>    a = 1

>>>A.a
>>>1

这与C ++和Java不同,后者无法使用实例访问静态成员: -

>>>inst  = A()
>>>inst.a
1
>>> 

内置方法setattr也可以帮助您设置static variable(data attribute)

>>>setattr(A, 'b', 2)
>>>A.b
>>>inst.b

答案 4 :(得分:-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