Python类静态变量声明:两类示例var差异及示例1用法正误辨析
Python类静态变量问题解答
1. 两个代码示例的核心区别
两个示例的代码如下:
# Example 1 class Foo: var = None def __init__(self): self.var = 1
# Example 2 class Bar: var = None def __init__(self): Foo.var = 1
核心差异有两点:
- 操作的变量所属主体不同:Example1的
__init__操作的是Foo类的实例自身的属性,Example2的__init__操作的是Foo类的类属性 - 冗余代码有效性不同:Example2中Bar类自己定义的类属性
var全程没有被访问或修改,属于无效定义;Example1中Foo类的类属性var是有效存在的,只是被实例同名属性屏蔽了访问优先级
2. var变量的变化逻辑差异
两者的var变量生效逻辑完全不同:
- Example1中存在两个独立的
var:- 类级别
Foo.var:也就是常说的静态变量,初始值为None,只要不主动通过Foo.var = xxx修改,这个值会一直保持为None,所有没有绑定var实例属性的Foo实例,访问var时都会取到这个值 - 实例级别
self.var:每个Foo实例化的时候都会单独生成一个属于自己的var属性,值为1,不同实例的这个属性完全独立,修改其中一个不会影响其他实例,也不会修改Foo.var的值
- 类级别
- Example2中操作的
var只有一个全局共享的Foo.var:
每次实例化Bar的时候,都会直接修改Foo类的类属性var为1,这个修改是全局生效的:只要实例化过一次Bar,所有未绑定var实例属性的Foo实例访问var时都会拿到修改后的值,Foo.var本身也会被永久修改。而Bar自己的类属性var没有任何逻辑用到,值永远是初始的None。
3. Example1中的var属性相关判定
首先明确Python中没有严格的“静态变量”语法定义,开发者通常把直接定义在类作用域下、所有实例共享的类属性当作静态变量使用,所以:
- Example1中直接定义在Foo类下的
var = None本身就属于类属性(也就是大家常说的静态变量),定义本身是合规的。 - 这个写法是不是错误完全看使用目的:
- 如果你就是需要「类保留默认值,每个实例可以有自己独立的同名属性」,那这个写法完全没问题,是Python的常规用法
- 如果你是想把这个
var作为全局共享的静态变量,所有实例读写都操作同一个值,那这个写法就是错误的——因为实例化后实例访问var会优先取自己的实例属性,既不会同步类属性的修改,也不会通过修改实例属性更新类属性。
内容的提问来源于stack exchange,提问作者jason m
相关产品推荐
相关产品推荐

