簡體   English   中英

多重繼承並將參數傳遞給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"

可以看出,它們在構造函數中采用相同的輸入參數。 現在,我想創建一個繼承自ABC的類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

可能出什么問題了? 真的需要BC必須包含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.

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