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

質問の興味と信頼性の高い例の両方でアップしました。 – 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