一.今日主要內容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 '''