十七、python 繼承多重繼承
繼承
1、根據已有的類生產新的類
繼承的目的:代碼重用;多態
2、多重繼承
菱形繼承的問題
經典類:深度優先
新式類:廣度優先
Inspect.getmro(class)
---------------------------------------------------
如下體現新式類的廣度優先:即尋找順序是: 類B---> 類C ----> 類A。如下代碼輸出:cc
class
A(object):
def
a(self):
print
'aa'
class B(A):
pass
# def a(self):
# print 'bb'
class C(A):
def
a(self):
print
'cc'
class E(B,C):
pass
e = E()
e.a()
如下體現經典類的深度優先:即尋找順序是: 類B---> 類A ----> 類C。如下代碼輸出:aa
class
A():
def
a(self):
print
'aa'
class B(A):
pass
# def a(self):
# print 'bb'
class C(A):
def
a(self):
print
'cc'
class E(B,C):
pass
e = E()
e.a()
---------------------------------------------------
------------------------------------------------
class A(object):
def __init__(self):
print 'in A'
class B(A):
pass
b = B()
class C(A):
print 'in c'
c = C()
class D(A):
def __init__(self):
A.__init__(self)
print 'in d'
d = D()
#----------------------------------------
class E:
print 'in E0000'
def __init__(self):
print 'in E'
class F:
print 'in F0000'
def __init__(self):
print 'in F'
class G(F,E): #交換兩個被繼承類的位置,你在看看??當兩個類中有相同方法時又是調用那個??
print 'in G'
g = G()
print '---------------------------'
class M(A):
def __init__(self):
#A.__init__(self)
super(M, self).__init__()
print 'in M'
class N(A):
def __init__(self):
#A.__init__(self)
super(N,self).__init__()
print 'in N'
class P(M,N): #發現A被初始化兩次??有問題,怎麼解決,用super調用
def __init__(self):
#M.__init__(self)
#N.__init__(self)
super(P,self).__init__() #使用super關鍵字,A就只被初始化一次。super關鍵字是新式類中有的,建議使用
print 'in P'
p = P()
#使用交互式
import inspect
inspect.getmro(P)
#(<class '__main__.P'>, <class '__main__.M'>, <class '__main__.N'>, <class '__main__.A'>, <type 'object'>)
#把A改成經典類,然後再把super註釋,因爲super是新式類的
inspect.getmro(P)
#(<class __main__.P at 0x00000000026CCA68>, <class __main__.M at 0x00000000026CCD08>, <class __main__.A at 0x00000000026CCDC8>, <class __main__.N at 0x00000000026CCA08>)
---------------------------------------------
注:
super(子類名字,self):self放在後面,需要和屬性方法分開