4

我有一堂课Parent。我想定义一个__new__forParent所以它在实例化时有一些魔力(为什么,见脚注)。我还希望子类从这个类和其他类继承以获取父类的功能。Parent's将__new__返回子类的基类和类的子类的实例Parent

这是子类的定义方式:

class Child(Parent, list):
    pass

但现在我不知道__new__Parent's中调用什么__new__。如果我打电话object.__new__,上面的Child例子抱怨list.__new__应该打电话。但是怎么会Parent知道呢?我让它工作,所以它遍历所有, 并在一个块内__bases__调用每个:__new__try:

class Parent(object):
    def __new__(cls, *args, **kwargs):
        # There is a special wrapper function for instantiating instances of children
        # classes that passes in a 'bases' argument, which is the __bases__ of the
        # Children class.
        bases = kwargs.get('bases')
        if bases:
            cls = type('name', bases + (cls,), kwargs.get('attr', {}))
            for base in cls.__mro__:
                if base not in (cls, MyMainType):
                    try:
                        obj = base.__new__(cls)
                        break
                    except TypeError:
                        pass
            return obj
        return object.__new__(cls)

但这只是看起来像一个黑客。当然,必须有更好的方法来做到这一点?

谢谢。

  • 我想使用的原因__new__是我可以返回一个子类的对象,该对象具有__int__分配给该类的一些动态属性(魔术属性等)。我本可以在 中完成此操作__init__,但如果新类具有不同的内部结构,我将无法在其中进行修改self.__class__,由于多重继承,这里就是这种情况。__init__
4

1 回答 1

4

我认为这会让你得到你想要的:

return super(Parent, cls).__new__(cls, *args, **kwargs)

而且您不需要bases关键字参数。除非我误会了你,而你是故意把它放在那里的。

于 2010-01-26T02:38:01.573 回答