python 繼承多重繼承

十七、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放在後面,需要和屬性方法分開

發佈了49 篇原創文章 · 獲贊 60 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章