我見過關於此主題的幾個問題,但我一直未能找到明確的答案。如何混合舊式和新式Python類?
我想知道在新的Python代碼庫中使用舊式類的正確方法。比方說,我有兩個固定類別,A和B。如果我要繼承一個和乙,並轉換爲新的樣式類(A2和B2),這個工程。但是,如果我想創建一個新類別C,從A2和B2有一個問題。
因此,如果任何基類被定義爲舊式,那麼是否有可能繼續使用此方法,或者是否所有類都必須符合舊式?
見澄清示例代碼:
class A:
def __init__(self):
print 'class A'
class B:
def __init__(self):
print 'class B'
class A2(A,object):
def __init__(self):
super(A2, self).__init__()
print 'class A2'
class B2(B,object):
def __init__(self):
super(B2, self).__init__()
print 'class B2'
class C(A2, B2):
def __init__(self):
super(C,self).__init__()
print 'class C'
A2()
print '---'
B2()
print '---'
C()
這段代碼的輸出:
class A
class A2
---
class B
class B2
---
class A
class A2
class C
正如你所看到的,問題是,在調用C()
,類B2從未初始化。
更新 - 新型類的實例
我想這是不明確的使用super
當正確的初始化序列應該是什麼。這是一個工作示例,其中調用超級確實初始化所有基類,而不僅僅是第一個它找到的。
class A(object):
def __init__(self):
super(A, self).__init__()
print 'class A'
class B(object):
def __init__(self):
super(B, self).__init__()
print 'class B'
class A2(A):
def __init__(self):
super(A2, self).__init__()
print 'class A2'
class B2(B):
def __init__(self):
super(B2, self).__init__()
print 'class B2'
class C(A2, B2):
def __init__(self):
super(C, self).__init__()
print 'class C'
C()
,併產生輸出:
class B
class B2
class A
class A2
class C
已更新的答案包括鑽石繼承的解釋和新風格類解決的問題。 – 2009-09-15 10:40:54
爲什麼你甚至有老式的課程呢? – 2009-09-15 10:52:39
第三方模塊,也許? – 2009-09-15 13:23:50