python - 如何从使用构建器实例化的类继承?

标签 python inheritance builder metaclass

我有一个类 Document,这个类的实例化非常复杂,所以我有一个构建器对象来创建它们。这两个元素都不是我的,所以我无法更改它们

现在,我想创建一个Document的子类,只是为了添加一些特定的方法。为了继续使用提供的构建器,我尝试了以下操作:

class SpecialDocument(Document):
     def __new__(cls, *args):
         return DocumentBuilder(*args)

     def __init__(self, *args, **kwargs):
         #My initialization

这里的问题是 __init__ 方法永远不会执行,因为 __new__ 方法不返回 SpecialDocument (它返回一个 >文档)

在我的特定情况下,我不需要以与构建文档不同的方式构建我的SpecialDocument。有没有办法使用同一个构建器?如果没有,我怎样才能实现这一目标?我只是想继承Document来添加特定的功能,也许可以通过元类来实现,但我从未使用过它们(可能是因为我不完全理解它),对它们的一些了解是如果它能帮助解决我的问题就好了

最佳答案

这里实际上并不需要元类 - 您只需正确调用父类(super class)的 __new__ 方法即可。按照您的方式,父类(super class)的实例化根本不“知道”它是从子类调用的。

所以,只需像这样编写代码:

class SpecialDocument(Document):
     def __new__(cls, *args):
         return super().__new__(cls, *args)

     def __init__(self, *args, **kwargs):
         #My initialization

现在,这是执行此操作的常规方法 - 如果“构建器”函数中的代码正确放置在 Docment 的 __new____init__ 内,则该方法将起作用。< br/> 由于那里的代码没有这样做,并且您不能将子类作为参数传递给构建器,因此可行的解决方案可能是创建一个普通文档,并在构建后交换其类:

def special_document_init(special_document):
    ...

class SpecialDocument(Document):
    def my_special_method(self, ...):
         ...
    def overriden_method(self):
         ...
         result = super().overriden_method()
         ...

def build_special_document(*args):
    document = DocumentBuilder(*args)
    document.__class__ = SpecialDocument
    special_document_init(document)
    return document

关于python - 如何从使用构建器实例化的类继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40117998/

相关文章:

python - python 中的 xml2array

python - 从字符串中保存和检索 Numpy 数组

java - 与继承 Java 不兼容的类型

c++ - const 引用、作为参数的构造函数和可编译性

具有通用类型边界的 Java Builder 模式

python - 绘制系列饼图

python - 'datalim' 属性有什么作用?

C++模板抽象继承

java - 创建具有相同值的多个对象时重用构建器实例是否可以接受?

Javascript 插件/片段组合器