[英]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.