如何在 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)
您的类中可以有两个不同的同名变量(一个静态变量和一个普通变量)。 别混淆了。
补充一下,函数中也可以有静态变量,而不仅仅是类:
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
类体内声明的所有变量都是“静态”属性。
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)。
有关此约定及其含义的更多详细信息,请参阅官方文档的快速摘录:
“私有”实例变量只能从 在对象内部,Python 中不存在。然而,有一个 大多数 Python 代码遵循的约定:名称前缀为 下划线(例如 _spam)应被视为非公开部分 API(无论是函数、方法还是数据成员)。它 应被视为实施细节并可能发生变化 恕不另行通知。
因为类私有成员有一个有效的用例(即 避免名称与子类定义的名称发生名称冲突),有 对这种称为名称修改的机制的支持有限。任何 __spam 形式的标识符(至少两个前导下划线,位于 大多数尾随下划线)被文本替换为 _classname__spam,其中 classname 是删除前导下划线的当前类名称。这种破坏是在不考虑的情况下完成的 到标识符的语法位置,只要它出现 在类的定义内。
静态属性是Python中的数据属性。 这样在类中分配的属性:-
>>>class A(object):
>>> a = 1
>>>A.a
>>>1
这与 C++ 和 Java 不同,在 C++ 和 Java 中,无法使用实例访问静态成员:-
>>>inst = A()
>>>inst.a
1
>>>
还有内置方法
setattr
将帮助您设置static variable(data attribute)
。
>>>setattr(A, 'b', 2)
>>>A.b
>>>inst.b
对于那些来这里使用
setattr
作为向类添加静态方法的方法的人来说,您需要 staticmethod
函数。
def func_c():
return 1
class A:
pass
setattr(A, 'f', staticmethod(func_c))
a_instance = A()
a_instance.f()
基本原理
如果是你的类,这样写比较容易:
class A:
@staticmethod
def func_c():
return 1
但是,情况并非总是如此。
由于传递函数时默认 setattr 更改为
classmethod
,这将抛出 TypeError: func_c() takes 0 positional arguments but 1 was given
。
def func_c():
return 1
class A:
pass
setattr(A, 'f', func_c)
a_instance = A()
a_instance.f()
您可以使用标准的@property装饰器来制作静态属性:
class A(object):
@property
def a(self):
return 1
a = A()
print a.a
1
a.a = 2
AttributeError: can't set attribute