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