2017-07-19 20 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