[英]Passing multiple arguments with (**kwargs) wildcard to Parent Class in Multiple Inheritance - Python
[英]Multiple inheritance and passing arguments to inherited class in python
我定義了以下類:
class A(object):
def __init__(self, a, b):
self.a = a
self.b = b
self.c = ""
def mA1(self):
print "Method 1 in A"
def mA2(self):
print "Method 2 in A"
def mA3(self):
print "Method 3 in A"
class B(object):
def __init__(self, a, b):
self.a = a
self.b = b
self.x = 0
def mB1(self):
print "Method 1 in B"
class C(object):
def __init__(self, a, b):
self.a = a
self.b = b
self.c = ""
self.y = 1
def mC1(self):
print "Method 1 in C"
def mC2(self):
print "Method 2 in C"
可以看出,它們在構造函數中采用相同的輸入參數。 現在,我想創建一個繼承自A
, B
和C
的類D
,以便可以將參數直接傳遞給D
的構造函數,如下所示:
clsT = D(1, 2)
所以,我嘗試了所提到這里如下修訂的定義:
class A(object):
def __init__(self, a, b):
self.a = a
self.b = b
self.c = ""
def mA1(self):
print "Method 1 in A"
def mA2(self):
print "Method 2 in A"
def mA3(self):
print "Method 3 in A"
class B(A):
def __init__(self, **kw):
super(B, self).__init__(**kw)
self.x = 0
def mB1(self):
print "Method 1 in B"
class C(A):
def __init__(self, **kw):
super(C, self).__init__(**kw)
self.c = ""
self.y = 1
def mC1(self):
print "Method 1 in C"
def mC2(self):
print "Method 2 in C"
class D(A, B, C):
def __init__(self, a, b):
super(D, self).__init__(a=a, b=b)
ci = D(1, 2)
print "a = ", ci.a
print "b = ", ci.b
print "c = ", ci.c
print "x = ", ci.x
print "y = ", ci.y
上面的方法似乎無效,並給我以下錯誤:
class D(A, B, C):
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution
order (MRO) for bases B, C, A
可能出什么問題了? 真的需要B
和C
必須包含super()
,並在中級基類上創建線性繼承嗎? 除了我的解釋,還有其他選擇嗎? 如果沒有,我該如何調整才能使它正常工作?
我如下更改了D
的類定義,並且它起作用了
class D(B, C, A):
def __init__(self, a, b):
super(D, self).__init__(a=a, b=b)
因此整個類看起來像(我刪除了使代碼簡短的方法)
class A(object):
def __init__(self, a, b):
self.a = a
self.b = b
self.c = ""
class B(A):
def __init__(self, **kw):
super(B, self).__init__(**kw)
self.x = 0
class C(A):
def __init__(self, **kw):
super(C, self).__init__(**kw)
self.c = ""
self.y = 1
class D(B, C, A):
def __init__(self, a, b):
super(D, self).__init__(a=a, b=b)
c = D(1, 2)
print(c.a, c.b, c.x, c.c, c.y)
輸出將是
1 2 0 1
這是由於MRO算法中的一條規則說的(此處詳細解答 ,但要點是
一個類總是出現在其祖先之前(“單調性”)
因此B和C必須出現在A之前,因為A是B和C的祖先
換句話說:D從A,B和C繼承。由於B和C已經從A繼承,因此python現在無法確定首先要查找哪種類的方法。 如果使用舊的定義順序,則為A或B和C。 D(A, B, C)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.