Python多重继承:调用哪个新的?

Python多重继承:调用哪个新的?,python,new-operator,multiple-inheritance,class-hierarchy,Python,New Operator,Multiple Inheritance,Class Hierarchy,我有一个班级家长。我想为父级定义一个\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,这样它在实例化时会产生一些魔力(为什么,请参见脚注)。我还希望子类继承这个类和其他类,以获得父类的功能。父类的\uuuu new\uuuu将返回子类的基类和父类的子类的实例 以下是子类的定义方式: class Child(Parent, list): pass 但是现在我不知道在家长的中调用什么\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

我有一个班级
家长
。我想为
父级定义一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,这样它在实例化时会产生一些魔力(为什么,请参见脚注)。我还希望子类继承这个类和其他类,以获得父类的功能。
父类
\uuuu new\uuuu
将返回子类的基类和
父类
的子类的实例

以下是子类的定义方式:

class Child(Parent, list):
    pass
但是现在我不知道在
家长的
中调用什么
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
。如果我调用
object.\uuuuu new\uuuuu
,上面的
子对象
示例会抱怨应该调用
列表。但是父母怎么知道呢?我让它工作,所以它在所有
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

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)
但这看起来像是一个黑客。当然,一定有更好的方法来做到这一点

谢谢

  • 我想使用
    \uuuuu new\uuuuuu
    的原因是,我可以返回一个子类的对象,该子类具有一些动态属性(magic
    \uuuuu int\uuuuuu
    属性等)。I,但如果新类具有不同的内部结构,我将无法在
    \uuuuu init\uuuuuuu
    中修改
    self.\uuuuu class\uuuuuuu
    ,这是由于多重继承造成的

    • 我想这会让你得到你想要的:

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

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

      我有一个答案,但后来我意识到我完全误解了你的问题,所以我删除了它,然后修改了它,并取消了它。我认为新的答案解决了你的问题,并且会起作用。我已经做了一些简单的测试。你显然进入了元类编程领域,既棘手又奇妙。new出现错误的原因是
      对象
      和内置类型,如
      列表
      dict
      ,以及带有
      插槽的对象都有不同的内存布局。对你正在努力完成的事情有更多的了解会有很大帮助。您可能还想看看在元类槽中使用类装饰器或函数。我不确定您为什么需要修改self。\uuuuu class\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。如果你需要在纽约做这样复杂的魔术,一个更容易的解决方案是根本不做,而是使用工厂。我认为这就做到了。我以前尝试过这个,不幸的是,我的代码中还有一些其他的错误,阻止了它的工作。超级函数是一颗神奇的子弹。@MTsoul,的确如此。老实说,我不知道这到底是为什么,我只是觉得它会起作用。:-)