python - 通过继承共享基础对象

标签 python inheritance python-3.x wrapper composition

我有类 Base。我想在 Derived 类中扩展它的功能。我打算写:

class Derived(Base):
  def __init__(self, base_arg1, base_arg2, derived_arg1, derived_arg2):
    super().__init__(base_arg1, base_arg2)
    # ...
  def derived_method1(self):
    # ...

有时我已经有了一个 Base 实例,我想基于它创建一个 Derived 实例,即一个 Derived 实例共享 Base 对象(不会从头开始重新创建它)。我想我可以写一个静态方法来做到这一点:

b = Base(arg1, arg2) # very large object, expensive to create or copy
d = Derived.from_base(b, derived_arg1, derived_arg2) # reuses existing b object

但这似乎是不可能的。要么我错过了使这项工作成功的方法,要么(更有可能)我错过了一个非常重要的原因,为什么它不能被允许工作。谁能解释一下是哪一个?

[当然,如果我使用组合而不是继承,这一切都很好办。但我希望通过 __getattr__ 避免将所有 Base 方法委托(delegate)给 Derived。]

最佳答案

取决于您的 Base 类使用 base_arg1base_arg2 做什么。

class Base(object):
    def __init__(self, base_arg1, base_arg2):
        self.base_arg1 = base_arg1
        self.base_arg2 = base_arg2
        ...

class Derived(Base):
    def __init__(self, base_arg1, base_arg2, derived_arg1, derived_arg2):
        super().__init__(base_arg1, base_arg2)
        ...

    @classmethod
    def from_base(cls, b, da1, da2):
        return cls(b.base_arg1, b.base_arg2, da1, da2)

关于python - 通过继承共享基础对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13799499/

相关文章:

Python pptx (Power Point) 查找和替换文本 (ctrl + H)

python-3.x - 如何在Python中慢慢画一条线

Python:安装和使用 Exscript 模块 Windows x86

java - 如果方法中参数的类扩展了抽象方法中使用的参数的类,则覆盖方法中参数的类

java - 泛型方法的子类实现

java - 关于继承和可扩展性的一般 OO 问题

python-3.x - 从pycharm使用pytest运行时获取空测试套件

Python 3 - 将谷歌电子表格保存为 csv

python - 嵌套列表理解和等效 for 循环中的不同输出

Python:余弦相似度 m * n 矩阵