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