如何在Python中声明静态属性?
这里写的是我如何声明一个方法: Static methods in Python?
答案 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