簡體   English   中英

為什么python中的繼承要求父類顯式繼承對象?

[英]Why inheritance in python require the parent class to inherit object explicitly?

以下是我的代碼的兩個版本:

不工作的人

class A:
    def __init__(self):
        print "I am A "

class B:
    def __init__(self):
        print "I am B "

class C(A, B):
    def __init__(self):
        super(C, self).__init__()

c = C()

這引發了異常:

    super(C, self).__init__()  
TypeError: must be type, not classobj  

工作版本

class A(object):
    def __init__(self):
         print "I am A "

class B:
    def __init__(self):
         print "I am B "

class C(A, B):
    def __init__(self):
         super(C, self).__init__()

c = C()

如果父類之一顯式繼承了object ,則沒有異常,並且一切正常。 任何解釋,為什么?

通過上述工作 ,它將顯示“我是A”而不顯示“我是B”,這意味着它僅初始化A類,而不初始化B。如何在子類中初始化多個父類?

這是因為super僅適用於新型類(繼承自object )。 在Python 2中, object在繼承層次結構中不存在的類(如您的第一個示例)被稱為類,並且永遠不要在任何地方使用。

這是從Python首次添加OO到開發人員弄錯時的一個古老歷史工件。 除其他外,新型類允許使用super ,描述符協議(屬性),並對處理多重繼承的方式進行了一些修復。 super是其中之一,但最重要的是鑽石繼承案例(A繼承自B和C都繼承自D)的方法解析順序的計算方式。 在此處了解更多信息: http : //python-history.blogspot.fr/2010/06/method-resolution-order.html

請注意,Python 3完全放棄了舊式類,因此在Python 3中,所有類都是新式類,並且從對象繼承,而不管它們是否顯式執行。

super()僅適用於新型類(任何從object繼承的類)。因此您無法將class object傳遞給super

超級有兩種典型的用例。 在具有單一繼承的類層次結構中,super可以用於引用父類而無需顯式命名它們,從而使代碼更具可維護性。 這種用法與其他編程語言中super的用法非常相似。

第二個用例是在動態執行環境中支持協作式多重繼承。 該用例是Python獨有的,在靜態編譯語言或僅支持單繼承的語言中找不到。 這使得在多個基類實現相同方法的情況下實現“菱形圖”成為可能。 良好的設計要求該方法在每種情況下都具有相同的調用簽名(因為調用的順序是在運行時確定的,因為該順序適合於類層次結構中的更改,並且因為該順序可以包含在運行時之前未知的同級類)。

典型的超類調用如下所示:

class C(B):
    def method(self, arg):
        super(C, self).method(arg)

暫無
暫無

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

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