我有一个返回类Parent的实例的函数:
def generateParent():
do_stuff
return Parent(some_parameters)
现在我想初始化一个Parent的子类,其中包含对generateParent()
的调用结果:
class Child(Parent):
def __new__():
return generateParent(some_other_parameters)
问题是,当我从Child中的Parent重写某些方法然后在我的程序中的Child实例中调用它们时,将调用原始的Parent方法而不是Child中的新方法。我在这里做错了吗?我在这里使用正确的设计来完成我的任务吗?
编辑:我既没有访问Parent也没有访问generateParent()
class Child(object):
def __init__(self):
self.obj = generateParent()
def __getattr__(self, attr):
return getattr(self.obj, attr)
答案 0 :(得分:4)
由于generateParent
不是您的代码,因此您可能希望使用包含和委派来代替继承。也就是说,不是定义子类,而是定义包含生成对象的包装类,在需要时转发对它的方法调用,但可以在包装器中添加新行为或修改过的行为。
在this question中,OP有类似的情况,有一个在库中生成的类,但是想要扩展类和/或修改类的某些行为。看看我是如何在这个问题中添加一个包装类的,你可能会考虑在这里做类似的事情。
答案 1 :(得分:1)
这是一种方法:
def generateChild(params):
p = generateParent(params)
p.__class__ = Child
return p
class Child(Parent):
# put method overrides etc here
childinstance = generateChild(some_params)
答案 2 :(得分:1)
也许您希望generateParent
能够创建其他类的实例:
def generateParent(cls=Parent):
do_stuff
return cls(some_parameters)
现在这将成为一个Child对象:
child = generateParent(Child)
或许您希望Parent及其所有派生类使用公共初始化代码?
class Parent(object):
def __init__(self):
do_stuff
# init from some_parameters
class Child(Parent):
# blah..
使您的Child对象能够从创建的Parent对象复制信息:
class Child(Parent):
def __init__(self):
model_parent = generateParent()
self.a = model_parent.a
self.b = model_parent.b
# etc.