假设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
都是类属性,而不是实例属性,所以它们附加到它们各自的类,而不是实例。X
和X
的实例会看到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
的版本,等等。