【问题标题】:Python multiple inheritance and memory allocationPython多重继承和内存分配
【发布时间】:2021-12-06 06:55:05
【问题描述】:

假设 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 是为基类中的每个 变量 分配内存,还是只为解析的 变量 分配内存?

【问题讨论】:

标签: python python-3.x multiple-inheritance


【解决方案1】:

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

如果您确实将它们设为实例属性(分配给每个类的 __init__ 中的 self.variable),并适当地使用 super() 以确保调用所有 __init__s,那么会有当您完成初始化时,仅是self.variable 的一个副本(哪个幸存下来取决于您是初始化self.variable 还是在各种__init__ 实现中首先调用super().__init__())。这是因为 Python 不会按照你的想法“解析”名称。实例属性按字符串名称存储在 dict 底层,最后分配给该名称的值获胜。

拥有多个具有“相同”名称的实例属性的唯一方法是将它们设为私有,方法是在它们前面加上__;在这种情况下,所有三个都定义了self.__variable,每个类的方法都会看到__variable 的唯一名称错位版本(父类或子类不使用); X 根本看不到一个,但它从A 继承的方法会看到A 的版本,从B 继承的方法会看到B 的版本,等等。

【讨论】:

    猜你喜欢
    • 2019-11-11
    • 2011-01-18
    • 2010-12-26
    • 2016-02-25
    • 1970-01-01
    • 2020-12-18
    • 2021-08-05
    • 1970-01-01
    • 2018-06-15
    相关资源
    最近更新 更多