巨蟒python全棧開發-第21天 繼承

一.今日主要內容python

1.瞭解python2和python3類的區別
python2在2.2以前使用的是經典類,2.2以後,使用的是新式類
class Foo:
pass
class Foo(object):
pass

MRO:method resolution order 方法的查找順序

class Base:
pass
class Base1:
def chi():
pass
class Bar(Base,Base1):
pass

b=Bar() #Bar => Base=>Base1
b.chi()

2.經典類的MRO (樹形結構的深度優先遞歸遍歷,這個須要瞭解)=>樹形結構的遍歷

3.新式類的MRO C3算法(筆試或者面試別人的算法)(難點,重點)(python沒有用過廣度優先)
(1)拆分
(2)合併

用頭和身體比較
4.super() 找MRO順序的下一個 #只有講完MRO才能講
5.一道面試題

二.今日內容大綱:面試

1.深度遞歸算法

2.MRO_C3spa

3.supercode

三.今日內容詳解:blog

1.深度遞歸遞歸

class A:
    pass
class B(A):
    pass
class C(A):
    pass
class D(B, C):
    pass
class E:
    pass
class F(D, E):
    pass
class G(F, D):
    pass
class I:
    pass
class J(B, C):
    pass
class K(A):
    pass
class H(I, J, K):
    pass
class Foo(H, G):
    pass

 

結果:it

#FOO=>H=>I=>J=>B=>A=>C=>K=>G=>F=>D=>E

 

 

2.MRO_C3io

class A:
    pass
class B(A):
    pass
class C(A):
    pass
class D(B, C):
    pass
class E(C, A):
    pass
class F(D, E):
    pass
class M:
    pass
class N(M):
    pass
class P(E, A):
    pass
class X:
    pass
class Q(P, N, X):
    pass
class G(Q, F):
    pass
class H(G, F):
    pass

'''
L(H) = H + L(G) + L(F) + GF # HGQPFDBECANMX

L(G) = G + L(Q) + L(F) + QF # GQPFDBECANMX 
L(Q) = Q + L(P) + L(N) + X + PNX # QPECANMX     (Q+PECA+NM+X+PNX)
L(P) = P + L(E) + A + EA  # PECA
L(E) = E + L(C) + A + CA   # ECA
L(C) = C + A + A   # CA
L(N) = N + M # NM

L(F) = F + L(D) + L(E) + DE # FDBECA
L(D) = D + L(B) + L(C) + BC # DBCA


'''
'''
    求H的MRO
    設求MRO的算法是L
    L(H) = H + L(G) + L(F) + GF
    L(G) = G + L(E) + E
    L(E) = E + L(C) + L(A) + CA
    L(C) = C + L(A) + A
    L(A) = A
    L(F) = F + L(D) + L(E) + DE
    L(D) = D + L(B) + L(C) + BC
    L(B) = B + L(A) + A

    # 加法:merge(), 拿第一項的第一位和 後面每項的除了第一位比較. 若是沒有出現, 則該位元素算出
        若是出現了. 此時開始下一項的第一位繼續和後面每一項的除了第一位比較:

        用頭和後面身體比較

    L(H) = H + L(G) + L(F) + GF # ECA + DBECA  = HGFDBECAO
    L(G) = G + L(E) + E # GECA
    L(E) = E + L(C) + L(A) + CA # ECA
    L(C) = C + L(A) + A  # CA
    L(A) = A
    L(F) = F + L(D) + L(E) + DE # FDBECA
    L(D) = D + L(B) + L(C) + BC # DBCA
    L(B) = B + A + A   # BA
'''
print(H.__mro__)

 

3.superclass

(1)

class Base1:
    def chi(self):
        print('我是可憐的Base1')
class Base2:
    def chi(self):
        print('我是可憐的Base2')
class Base3:
    def chi(self):
        print('我是可憐的Base3')
class Bar(Base1,Base2,Base3):
    def chi(self):
        print('我是Bar裏面的吃')
        #super(類名,self)         #從某個類開始找下一個MRO
        super(Bar,self).chi()     #此時調用的super,在Bar調用=>super表示找MRO裏的下一個
        #super(Base1,self).chi()
        #super(Base2,self).chi()

b = Bar() #順序: Bar, Base1, Base2, Base3, object
b.chi()
print(Bar.__mro__)

(2)

class Base1:
    def chi(self):
        super().chi() # super找的是MRO的下一個.
        print("我是可憐的Base1")

class Base2:
    def chi(self):
        super().chi()
        print("我是可憐的Base2")

class Base3:
    def chi(self):
        print("我是可憐的Base3")

class Bar(Base1, Base2, Base3):
    def chi(self):
        print("我是Bar裏面的吃1")
        # super(類名, self) 從某個類開始找下一個MRO
        super(Bar, self).chi() # 此時調用的super. 在Bar調用 -> super表示找MRO裏的下一個
        # super().chi() # super(Bar, self).chi()
        print("我是Bar裏面的吃2")

b = Bar() # 報錯 若是是Base1 object,會報錯,注意這裏的細節
b.chi() # 報錯
#

 

(3)

# MRO + super ⾯試題
class Init(object):                        #在下面對應子類和父類均可以
    def __init__(self,v):                  #在這裏注意解題的標記
        print('init')                           #HaHa
        self.val=v
class Add2(Init):
    def __init__(self,val):
        print('Add2')
        super(Add2, self).__init__(val)         #Pro
        print(self.val)
        self.val+=2
class Mult(Init):
    def __init__(self,val):
        print('Mult')
        super(Mult,self).__init__(val)          #Add2
        self.val*=5
class HaHa(Init):
    def __init__(self,val):
        print('哈哈')
        super(HaHa,self).__init__( val)         #Mult
        self.val/=5
class Pro(Add2,Mult,HaHa):                      #Incr
    pass
class Incr(Pro):                    # incr->pro->add2->Mult->HaHa->init
    def __init__(self,val):
        super(Incr,self).__init__(val)          #Add2
        self.val+=1
# print(Incr.__mro__)

p=Incr(5)
print(p.val)
# Incr Pro Add2 Mult HaHa Init
# p = Incr(5) # p.val = 8.0
'''結果:
# # Add2
# # Mult
# # 哈哈
# # init
# # 5.0
# # 8.0
'''
p=Add2(2)
print(p.val)
# Add2, Init, Object c.val = 2
# Add2
# init
# 2
# 4

'''

MRO: method resolution order            #方法查找順序
Incr,Pro,Add2,Mult,HaHa,Init,Object

'''
相關文章
相關標籤/搜索