2017-07-19 63 views
1

我如何写一个默认__new__像这样的一些小变化:如何覆盖具有多重继承的`__new__`?

class A: 
    def __new__(cls, *args, **kwargs): 
     retval = super().__new__(cls, *args, **kwargs) 
     retval.tree_parent = None 
     return retval 

class B(A): 
    def __init__(self, x): 
     self.x = x 

b = B(1) 

因为在多态链中的其他类的,我得到的错误的向上传递的参数不属于这一类的控制:

TypeError: object() takes no parameters 
+0

我SURP任何人都投票结束这一决定。为什么这会脱离主题? –

+0

Upvoted提出问题的兴趣和可靠的例子。 – Fabien

回答

1

默认__new__可以这样写它是traitlets模块:

def __new__(cls, *args, **kwargs): 
    # This is needed because object.__new__ only accepts 
    # the cls argument. 
    new_meth = super(HasDescriptors, cls).__new__ 
    if new_meth is object.__new__: 
     inst = new_meth(cls) 
    else: 
     inst = new_meth(cls, *args, **kwargs) 
    # Do something with inst. 
    return inst