代码
来自reddit的一段代码,链接:
class Parent:
x: int
class Child(Parent):
pass
Parent.x = 1
print(Child.x) # = 1. ok so child inherits parent class variable
Child.x = 2
print(Parent.x) # = 1. ok, so child cannot set parent class variable
Parent.x = 3
print(Child.x) # = 2. hol' up, now child doesn't inherit from parent anymore?
解析
类和实例变量定义,先看来自官网的定义:
class Dog:
kind = 'canine' # 所有实例共享类变量
def __init__(self, name):
self.name = name # 每个实例变量是相互独立的
另外,类和实例一样可以存放属性。比如:C.x,实际内部的读取逻辑是C.__dict__["x"]
。当我们在当前类中找不到属性就会继续在基类中继续查找属性。 链接
所以,第一个print(Child.x)
在本身的字典中没找到就会到父类Parent
中找相关属性,所以输出是1。而第二个print(Child.x)
输出是2的原因是
因为前面执行了Child.x = 2
,也就意味着Child
类的字典中存放了Child.__dict__["x"] = 2
,所以再次print(Child.x)
时输出就是2,
而不会再往基类中找相关属性。