Python类变量初始化机制疑问:为何实例对象的类变量值相同?
关于Python类变量初始化的问题解答
先看你提供的代码示例:
from datetime import datetime class A(object): now = datetime.now() def __init__(self): pass def p(self): print(self.now) # 执行过程 datetime.now() # 输出:2018-05-22 17:54:04.593295 a_1 = A() a_1.p() # 输出:2018-05-22 17:53:57.597022 datetime.now() # 输出:2018-05-22 17:54:29.177489 a_2 = A() a_2.p() # 输出:2018-05-22 17:53:57.597022
你疑惑的点在于:为什么创建两个实例后,它们的now值完全相同?其实核心原因是类变量的初始化时机——类变量是在类被定义的那一刻就完成初始化的,而不是每次创建实例的时候。
具体来说:
- 当Python解释器执行到
class A(object):这段代码时,会立即执行now = datetime.now(),把此时的时间赋值给A.now这个类属性,这个过程只会发生一次。 - 当你创建
a_1和a_2实例时,它们访问self.now的时候,因为实例本身没有now这个属性,所以会向上查找类的属性,也就是用的类定义时就已经固定的那个时间值。
如果想要每个实例拥有自己的创建时间,你需要把now定义为实例变量,也就是把赋值操作放到__init__方法里:
from datetime import datetime class A(object): def __init__(self): self.now = datetime.now() # 每次创建实例都会执行这行代码,生成当前时间 def p(self): print(self.now)
这样再创建实例时,a_1.now和a_2.now就会是各自创建时的时间了。
另外,如果你的需求是每次调用p()方法时都获取当前最新时间,而不是实例创建时的时间,可以用@property把它变成动态属性:
from datetime import datetime class A(object): @property def now(self): return datetime.now() # 每次访问now都会重新获取当前时间 def p(self): print(self.now)
这样每次调用a_1.p()或者a_2.p(),输出的都是调用时的最新时间。
内容的提问来源于stack exchange,提问作者kevin wong
相关产品推荐
相关产品推荐

