使用Parent实例初始化子级

时间:2013-01-06 00:00:58

标签: python class inheritance initialization

我有一个返回类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()

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

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

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

3 个答案:

答案 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)

  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. 使您的Child对象能够从创建的Parent对象复制信息:

    class Child(Parent):
        def __init__(self):
            model_parent = generateParent()
            self.a = model_parent.a
            self.b = model_parent.b
            # etc.