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,的确如此。老实说,我不知道这到底是为什么,我只是觉得它会起作用。:-)