You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:22:17