簡體   English   中英

多個 inheritance,TypeError: __init__() 需要 2 個位置 arguments 但給出了 3 個

[英]multiple inheritance, TypeError: __init__() takes 2 positional arguments but 3 were given

我正在學習 class 的多個 inheritance

class A(): 
    def __init__(self, a): 
        super().__init__() 
        self.a = a                                                                                                                                             

class B(): 
    def __init__(self, b): 
        super().__init__() 
        self.b = b 
         
class C(A, B): 
    def __init__(self, a, b, c): 
        super().__init__(a, b) 
        self.c = c 

C(1, 2, 3)導致錯誤TypeError: __init__() takes 2 positional arguments but 3 were given

我希望它可以按 A->B->C 的順序初始化,但在查找存在的相關問題后我仍然卡住了

如果您需要將特定的 arguments 賦予特定的超類,則需要明確地執行此操作:

class A(): 
    def __init__(self, a): 
        self.a = a                                                                                                                                             

class B(): 
    def __init__(self, b): 
        self.b = b 
         
class C(A, B): 
    def __init__(self, a, b, c): 
        A.__init__(self, a) 
        B.__init__(self, b)
        self.c = c

請注意,您也不能在類AB中執行super().__init__()了,因為super實際上並沒有調用 class 的超類,它是“寫入”的,但是下一個 class 是方法解析順序.

通常,這樣的代碼表明設計不當/子類化的濫用。


或者,您可以使用關鍵字 arguments 來解決此問題:

class A(): 
    def __init__(self, *, a, **kwargs):
        super().__init__(**kwargs)
        self.a = a

class B(): 
    def __init__(self, *, b, **kwargs): 
        super().__init__(**kwargs)
        self.b = b 

class C(A, B): 
    def __init__(self, a, b, c): 
        super().__init__(a=a, b=b)
        self.c = c

通過讓基類將額外的*args傳遞給 super 調用,使基類更加靈活:

class A(): 
    def __init__(self, a, *args): 
        super().__init__(*args) 
        self.a = a
        

class B(): 
    def __init__(self, b, *args): 
        super().__init__(*args) 
        self.b = b 
      

class C(A, B): 
    def __init__(self, a, b, c): 
        super().__init__(a, b) 
        self.c = c 

>>> c = C(1,2,3)
>>> c.a
1
>>> c.b
2
>>> c.c
3

最好使用關鍵字 arguments 以便不依賴 mro:

class A(): 
    def __init__(self, a=None, **kwargs): 
        super().__init__(**kwargs) 
        self.a = a
        

class B(): 
    def __init__(self, b=None, **kwargs): 
        super().__init__(**kwargs) 
        self.b = b
      

class C(A, B): 
    def __init__(self, a, b, c): 
        super().__init__(a=a, b=b) 
        self.c = c 

現在, class C(B, A)將按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM