gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:09 25 4
gpt4 key购买 nike

我有一个类 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com