Python类和实例变量

Posted by Shi Hai's Blog on January 3, 2025

代码

来自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, 而不会再往基类中找相关属性。