Python多重继承和内存分配



假设Python中的类层次结构如下:

class O:
variable = 0

class A(O):
variable = "abcdef"

class B(O):
variable = 1.0

class X(A, B):
pass

x = X()

当创建X的实例时,Python是为基类中的每个变量分配内存,还是只为解析的变量分配内存?

创建X实例时,不分配任何变量;所有的variable都是类属性,而不是实例属性,所以它们附加到它们各自的类,而不是实例。XX的实例会看到variable的值来自A,这要归功于它在没有在实例上设置名称时检查基类名称的顺序,但是variable的所有三个版本都存在。

如果您确实使它们具有实例属性(为每个类在__init__中分配给self.variable),并适当地使用super()来确保所有__init__都被调用,那么当您完成初始化时,只有self.variable的一个副本(哪一个存活将取决于您是初始化self.variable还是在各种__init__实现中首先调用super().__init__())。这是因为Python没有"解析"。用你思考的方式命名;实例属性通过字符串名称存储在dict底层,最后分配给该名称的值优先。

拥有多个具有"相同"属性的实例属性的唯一方法name是通过前缀__使它们私有;在这种情况下,所有三个定义self.__variable,将有一个唯一的__variable的名称混乱的版本,由每个类的方法看到(不被父类或子类使用);X根本看不到,但是从A继承的方法会看到A的版本,从B继承的方法会看到B的版本,等等。