TOP

python-day20(继承)

一. 多继承

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)
二. 经典类的MRO
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

三. C3算法

pass
class M(F, E):
pass
class N:
pass
class P(M,N):
pass
class G(P):
pass
class O:
pass
class X(O):
pass
class H(G, X, F):
pass
print(H.__mro__)
'''
L(H) = H + L(G) + L(X) + L(F) + GXF HGPMXFDBECANO

L(G) = G + L(P) + P # GPMFDBECAN
L(X) = X + L(O) + O # XO
L(F) = F + L(D) + L(E) + DE # FDBECA


L(P) = P + L(M) + L(N) + MN # PMFDBECAN
L(D) = D + L(B) + L(C) + BC # DBCA
L(E) = E + L(C) + L(A) + CA # ECA

L(M) = M + L(F) + L(E) + FE # ECA ECA E MFDBECA

'''


'''
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

super是查找mro顺序中的下一个

单继承中我们可以认为super是对父类中的属性或方法的引入
 1 # super是查找mro顺序中的下一个
 2 # 单继承中我们可以认为super是对父类中的属性或方法的引入
 3 
 4 class ShengWu:
 5     def dong(self): # 实例方法
 6         print(self)
 7         print("我是生物")
 8 
 9 class Animal(ShengWu):
10    pass
11 
12 class Cat(Animal):
13     def dong(self): # 子类中出现了和父类重名的内容. 表示对父类的方法的覆盖(重写). 半盖(java)
14         super(Animal, self).dong() # 定位到Animal. 找Animal的下一个
15         # super(类, 对象).方法()  找到MRO中的类. 找这个类的下一个. 去执行方法
16         print("我的猫也会动")
17 
18 # 找MRO中的下一个
19 # Cat -> Animal -> ShengWu
20 
21 c = Cat()
22 print(c)
23 c.dong()
24 
25 
26 
27 
28 # MRO + super ⾯试题
29 class Init(object):
30     def __init__(self, v):
31         print("init")
32         self.val = v # 2
33 class Add2(Init):
34     def __init__(self, val): # 2
35         print("Add2")
36         super(Add2, self).__init__(val)
37         print(self.val) # 5.0
38         self.val += 2 # 7.0
39 class Mult(Init):
40     def __init__(self, val):
41         print("Mult")
42         super(Mult, self).__init__(val)
43         self.val *= 5 # 5.0
44 class HaHa(Init):
45     def __init__(self, val):
46         print("哈哈")
47         super(HaHa, self).__init__(val)
48         self.val /= 5   # 1.0
49 class Pro(Add2,Mult,HaHa): #
50     pass
51 class Incr(Pro):
52     def __init__(self, val): # 5
53         super(Incr, self).__init__(val)
54         self.val += 1 # 8.0
55 
56         '''
57         add2
58         Mult
59         哈哈
60         init
61         5.0
62         8.0
63         Add2
64         init
65         2
66         4
67         
68         '''
69 
70 # Incr, pro, add2, mult, haha, Init
71 p = Incr(5)
72 print(p.val) # ?
73 # Add2 init
74 c = Add2(2)
75 print(c.val) # ?
View Code

 

  
posted on 2018-11-13 21:59  hui_T  阅读(172)  评论(0编辑  收藏  举报