我有一个班级Parent
。我想为__new__
定义一个Parent
,以便在实例化时做一些魔术(为什么,请参阅脚注)。我也希望子类继承这个和其他类来获得Parent的功能。 Parent
的{{1}}将返回子类的基类和__new__
类的子类的实例。
这就是如何定义子类:
Parent
但现在我不知道在class Child(Parent, list):
pass
的{{1}}中要拨打__new__
的内容。如果我致电Parent
,则上述__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)
属性等)。我could have done this in __init__
,但如果新类具有不同的内部结构,我将无法在__new__
中修改__int__
,这是由于多重继承所致。答案 0 :(得分:4)
我认为这会让你得到你想要的东西:
return super(Parent, cls).__new__(cls, *args, **kwargs)
,您不需要bases
关键字参数。除非我弄错了你并且故意把它放在那里。