码迷,mamicode.com
首页 > 编程语言 > 详细

python-继承

时间:2018-12-24 21:33:00      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:ini   print   init   span   def   出现   add   base   val   

 1 class A:
 2     pass
 3 class B(A):
 4     pass
 5 class C(A):
 6     pass
 7 class D(B, C):
 8     pass
 9 class E:
10     pass
11 class F(D, E):
12     pass
13 class G(F, D):
14     pass
15 class I:
16     pass
17 class J(B, C):
18     pass
19 class K(A):
20     pass
21 class H(I, J, K):
22     pass
23 class Foo(H, G):
24     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:
    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
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__)
# 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里面的吃1")
#         # super(类名, self) 从某个类开始找下一个MRO
#         super(Base2, self).chi() # 此时调用的super. 在Bar调用 -> super表示找MRO里的下一个
#         # super().chi() # super(Bar, self).chi()
#         print("我是Bar里面的吃2")
#
# b = Bar() # Bar, Base1, Base2, Base3, object
# b.chi()
# print(Bar.__mro__)


# 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() # 报错
# # 坑


# MRO + super ?试题
class Init(object):
    def __init__(self, v): # 2
        print("init")
        self.val = v

class Add2(Init):
    def __init__(self, val): # 2
        print("Add2")
        super(Add2, self).__init__(val) # Mult
        print(self.val)
        self.val += 2

class Mult(Init):
    def __init__(self, val):
        print("Mult")
        super(Mult, self).__init__(val) # Haha
        self.val *= 5

class HaHa(Init):
   def __init__(self, val):
        print("哈哈")
        super(HaHa, self).__init__(val) # Init
        self.val /= 5

class Pro(Add2,Mult,HaHa): #
    pass

class Incr(Pro): # incr->pro->add2->Mult->HaHa->init
    def __init__(self, val): # 5
        super(Incr, self).__init__(val) # Add2
        self.val += 1



‘‘‘
MRO: method resolution order
Incr,Pro,Add2,Mult,HaHa,Init,Object

super()
a = Incr()
a.chi()
‘‘‘

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

print(c.val) # 4
#

 

python-继承

标签:ini   print   init   span   def   出现   add   base   val   

原文地址:https://www.cnblogs.com/274831730wang/p/10170996.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!