[英]inheritance TypeError: __init__() takes from 1 to 2 positional arguments but 8 were given
[英]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
請注意,您也不能在類A
和B
中執行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.