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

Python中从实例访问类变量的机制是什么?一个易混淆示例

关于Python类变量与实例变量的访问差异解析

嘿,这个问题刚好戳中了Python里类变量和实例变量的核心区别,我来给你掰扯明白~

先看你第一个例子:

class Coo(object):
    num = 1
    def foo(self):
        print self.num
        print Coo.num
coo = Coo()
coo.foo()
# Output: 1 1

这时候实例coo还没有自己的num属性,当你用self.num访问时,Python会沿着属性查找链往上找,最终找到类Coo的num变量,所以和直接用Coo.num访问的是同一个值,输出自然都是1。

再看让你困惑的第二个例子:

class Coo(object):
    num = 1
    def foo(self):
        self.num = 2
        Coo.num = 3
        print self.num
        print Coo.num
coo = Coo()
coo.foo()
# Output: 2 3

这里的关键是**self.num = 2这行代码的本质**:它并不是修改类的num变量,而是给当前实例coo创建了一个属于它自己的实例变量num!从这一刻起,这个实例的num就和类的num彻底分家了。

而Coo.num = 3是直接修改了类本身的num变量,这个变化会影响所有没有创建自己num实例变量的其他实例。

为了验证这个点,你可以在调用foo()之后再试试这些代码:

print(coo.num)       # 输出2,取的是实例自己的变量
print(Coo.num)       # 输出3,取的是类的变量
coo2 = Coo()
print(coo2.num)      # 输出3,因为这个新实例还没创建自己的num,用的是类的变量

总结几个核心知识点:

  • 当实例没有对应属性时,self.变量名会向上查找类的属性
  • 一旦执行self.变量名 = 值,就会给实例创建独立的实例变量,和类变量解绑
  • 用类名.变量名操作的始终是类级别的变量,所有未自定义该属性的实例都会共享这个值

内容的提问来源于stack exchange,提问作者Kay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:33:38