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
相关产品推荐
相关产品推荐

