3

我有一个返回父类实例的函数:

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()

解决方案(感谢@Paul McGuire 的回答):

class Child(object):
    def __init__(self):
        self.obj = generateParent()

    def __getattr__(self, attr):
        return getattr(self.obj, attr)
4

3 回答 3

4

由于generateParent不是您的代码,因此您可能希望使用包含和委托,而不是继承。也就是说,不是定义子类,而是定义一个包含生成的对象的包装类,在需要时将方法调用转发给它,但可以在包装中添加新的行为或修改的行为。

这个问题中,OP 有类似的情况,在库中生成了一个类,但想要扩展该类和/或修改该类的某些行为。看看我是如何在那个问题中添加一个包装类的,你可能会考虑在这里做类似的事情。

于 2013-01-06T00:41:26.587 回答
1

这是一种方法:

def generateChild(params):
    p = generateParent(params)
    p.__class__ = Child
    return p

class Child(Parent):
    # put method overrides etc here

childinstance = generateChild(some_params)
于 2013-01-06T00:09:22.443 回答
1
  1. 也许您希望generateParent能够创建其他类的实例:

    def generateParent(cls=Parent):
        do_stuff
        return cls(some_parameters)
    

    现在这将创建一个 Child 对象:

    child = generateParent(Child)
    
  2. 或者您可能希望 Parent 及其所有派生类使用通用初始化代码?

    class Parent(object):
        def __init__(self):
            do_stuff
            # init from some_parameters
    
    class Child(Parent):
        # blah..
    
  3. 使您的子对象能够从创建的父对象复制信息:

    class Child(Parent):
        def __init__(self):
            model_parent = generateParent()
            self.a = model_parent.a
            self.b = model_parent.b
            # etc.
    
于 2013-01-06T00:50:49.787 回答