我有一个类Document,这个类实例化非常复杂,所以我有一个构建器对象来创建它们。这两个元素都不是我的,所以我无法改变它们
现在,我想创建一个Document的子类,只是为了添加一些特定的方法。为了继续使用提供的构建器,我尝试了这个:
class SpecialDocument(Document):
def __new__(cls, *args):
return DocumentBuilder(*args)
def __init__(self, *args, **kwargs):
#My initialization
这里的问题是__init__
方法永远不会执行,因为__new__
方法没有返回SpecialDocument
(它返回Document
)
在我的特定情况下,我不需要像构建SpecialDocument
那样构建我的Document
。有没有办法使用相同的建设者?如果没有,我怎么能实现这个目标?我只想继承Document
以添加特定的功能,也许它可以通过元类实现,但我从未使用它们(可能因为我不完全理解它),对它们的一点了解会很好如果它可以帮助解决我的问题
答案 0 :(得分:1)
你在这里实际上并不需要一个元类 - 你只需要正确地调用超类' __new__
方法。你这样做的方式,超类的实例化并没有“知道”#34;它从一个子类中被调用。
所以,只需编写这样的代码:
class SpecialDocument(Document):
def __new__(cls, *args):
return super().__new__(cls, *args)
def __init__(self, *args, **kwargs):
#My initialization
现在,这是通常的方式 - 并且如果您的"构建器中的代码可以使用#34;功能已正确放置在Docment的__new__
或__init__
内
由于那里的代码确实没有这样做,并且你可以将你的子类作为参数传递给构建器,一个可行的解决方案可能是创建一个普通的文档,并在构建它之后交换它的类:
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