super() 找MRO顺序的下一个
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
# 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 = vclass Add2(Init): def __init__(self, val): # 2 print("Add2") super(Add2, self).__init__(val) # Mult print(self.val) self.val += 2class Mult(Init): def __init__(self, val): print("Mult") super(Mult, self).__init__(val) # Haha self.val *= 5class HaHa(Init): def __init__(self, val): print("哈哈") super(HaHa, self).__init__(val) # Init self.val /= 5class Pro(Add2,Mult,HaHa): # passclass Incr(Pro): # incr->pro->add2->Mult->HaHa->init def __init__(self, val): # 5 super(Incr, self).__init__(val) # Add2 self.val += 1# Add2# Mult# 哈哈# init# 5.0# 8.0# Add2# init# 2# 4 |