我有一堂课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__