1. 程式人生 > >day20-2018-11-13多繼承

day20-2018-11-13多繼承

class Shen:
    def fly(self):
        print("大神會飛")
class Hou:
    def chi(self):
        print("猴子吃桃子")

class SunWuKong(Shen, Hou): # 一個類可以繼承多個無關的類. 一個類可以被多個無關的類繼承
    pass

class TaiShangLaoJun(Shen):
    pass
#
# swk = SunWuKong()
# swk.fly()
# swk.chi()


# 經典類. 在python2.2之前. 已經是歷史了. MRO 採用的是樹形結構的深度遞迴遍歷(一條道跑到黑)
# 新式類 在2.2之後產生新式類. 目前我們使用的. 所有的類的根都是object C3演算法(merge)
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 H:
    pass

class Foo(H, G):
    pass
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(F, E): pass class N: pass class P(M,N): pass class G(P): pass class O: pass class H(G, F): pass print(H.__mro__) ''' L(H) = H + L(G) + X+ L(F) HGPMFDBECAN FDBECA L(G) = G + L(P) GPMFDBECAN L(F) = F + L(D) + L(E) FDBECA L(P) = P + L(M) + L(N) PMFDBECAN L(D) = D + L(B) + L(C) DBCA L(E) = E + L(C) + L(A) ECA L(M) = M + L(F) + L(E) MFDBECA L(N) = N L(B) = B + L(A) BA L(C) = C + L(A) CA L(A) = A
''' ''' 設L為查詢方法的MRO順序 L(H) = H + L(G) + L(F) L(G) = G + L(E) L(F) = F + L(D) + L(E) L(D) = D + L(B) + L(C) L(B) = B + L(A) L(E) = E + L(C) + L(A) L(C) = C + L(A) L(A) = A 合併. 從下向上合併. 拿出每一項的頭和後一項的身體進行比較. 如果出現了. 就過, 從後一項的頭繼續去比較. 如果不出現就出來 HGFDBECA L(H) = H + L(G) + L(F) ECA + FDBECA L(G) = G + L(E) GECA L(F) = F + L(D) + L(E) FDBECA L(D) = D + L(B) + L(C) DBCA L(B) = B + L(A) BA L(E) = E + L(C) + L(A) ECA L(C) = C + A CA L(A) = A 新式類通過__mro__可以直接看到MRO的結果 ''' # HGF DBE CA object # print(H.__mro__) # 給面試官用的.
# super是查詢mro順序中的下一個
# 單繼承中我們可以認為super是對父類中的屬性或方法的引入

class ShengWu:
    def dong(self): # 例項方法
        print(self)
        print("我是生物")

class Animal(ShengWu):
   pass

class Cat(Animal):
    def dong(self): # 子類中出現了和父類重名的內容. 表示對父類的方法的覆蓋(重寫). 半蓋(java)
        super(Animal, self).dong() # 定位到Animal. 找Animal的下一個
        # super(類, 物件).方法()  找到MRO中的類. 找這個類的下一個. 去執行方法
        print("我的貓也會動")

# 找MRO中的下一個
# Cat -> Animal -> ShengWu

c = Cat()
print(c)
c.dong()




# MRO + super ⾯試題
class Init(object):
    def __init__(self, v):
        print("init")
        self.val = v # 2
class Add2(Init):
    def __init__(self, val): # 2
        print("Add2")
        super(Add2, self).__init__(val)
        print(self.val) # 5.0
        self.val += 2 # 7.0
class Mult(Init):
    def __init__(self, val):
        print("Mult")
        super(Mult, self).__init__(val)
        self.val *= 5 # 5.0
class HaHa(Init):
    def __init__(self, val):
        print("哈哈")
        super(HaHa, self).__init__(val)
        self.val /= 5   # 1.0
class Pro(Add2,Mult,HaHa): #
    pass
class Incr(Pro):
    def __init__(self, val): # 5
        super(Incr, self).__init__(val)
        self.val += 1 # 8.0

        '''
        add2
        Mult
        哈哈
        init
        5.0
        8.0
        Add2
        init
        2
        4
        
        '''

# Incr, pro, add2, mult, haha, Init
p = Incr(5)
print(p.val) # ?
# Add2 init
c = Add2(2)
print(c.val) # ?