1 1、不正确用法
2 class Vehicle: # 定义交通工具类
3 Country = 'China'
4
5 def __init__(self, name, speed, load, power):
6 self.name = name
7 self.speed = speed
8 self.load = load
9 self.power = power
10
11 def run(self):
12 print('开动啦...')
13
14
15 class Subway(Vehicle): # 地铁
16 def __init__(self, name, speed, load, power, line):
17 Vehicle.__init__(self, name, speed, load, power)
18 self.line = line
19
20 def run(self):
21 print('地铁%s号线欢迎您' % self.line)
22 Vehicle.run(self)
23
24
25 line13 = Subway('中国地铁', '180m/s', '1000人/箱', '电', 13)
26 line13.run()
27
28 # 地铁13号线欢迎您
29 # 开动啦...
30
31 2、正确用法
32
33 class Vehicle: # 定义交通工具类
34 Country = 'China'
35
36 def __init__(self, name, speed, load, power):
37 self.name = name
38 self.speed = speed
39 self.load = load
40 self.power = power
41
42 def run(self):
43 print('开动啦...')
44
45
46 class Subway(Vehicle): # 地铁
47 def __init__(self, name, speed, load, power, line):
48 # super(Subway,self) 就相当于实例本身 在python3中super()等同于super(Subway,self)
49 super().__init__(name, speed, load, power)
50 self.line = line
51
52 def run(self):
53 print('地铁%s号线欢迎您' % self.line)
54 print(super(Subway,self).run)
55 super(Subway, self).run()
56
57
58 class Mobike(Vehicle): # 摩拜单车
59 pass
60
61
62 line13 = Subway('中国地铁', '180m/s', '1000人/箱', '电', 13)
63 line13.run()
64
65 # 地铁13号线欢迎您
66 # <bound method Vehicle.run of <__main__.Subway object at 0x00000000027DA390>>
67 # 开动啦...
68
69
70 惨案!!!!!!!!!!!!!!!!!!!!!!!
71
72 #每个类中都继承了且重写了父类的方法
73 class A:
74 def __init__(self):
75 print('A的构造方法')
76 class B(A):
77 def __init__(self):
78 print('B的构造方法')
79 A.__init__(self)
80
81
82 class C(A):
83 def __init__(self):
84 print('C的构造方法')
85 A.__init__(self)
86
87
88 class D(B,C):
89 def __init__(self):
90 print('D的构造方法')
91 B.__init__(self)
92 C.__init__(self)
93
94 pass
95 f1=D()
96
97 print(D.__mro__) #python2中没有这个属性
98
99 # D的构造方法
100 # B的构造方法
101 # A的构造方法
102 # C的构造方法
103 # A的构造方法
104 # (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
105
106
107 #每个类中都继承了且重写了父类的方法
108 class A:
109 def __init__(self):
110 print('A的构造方法')
111 class B(A):
112 def __init__(self):
113 print('B的构造方法')
114 super(B,self).__init__()
115
116
117 class C(A):
118 def __init__(self):
119 print('C的构造方法')
120 super(C,self).__init__()
121
122
123 class D(B,C):
124 def __init__(self):
125 print('D的构造方法')
126 super(D,self).__init__()
127
128 f1=D()
129
130 print(D.__mro__) #python2中没有这个属性
131
132 # D的构造方法
133 # B的构造方法
134 # C的构造方法
135 # A的构造方法
136 # (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
137
138
139 # 当你使用super()函数时,Python会在MRO列表上继续搜索下一个类。
只要每个重定义的方法统一使用super()并只调用它一次,那么控制流最终会遍历完整个
140 # MRO列表,每个方法也只会被调用一次(注意注意注意:使用super调用的所有属性,
都是从MRO列表当前的位置往后找,千万不要通过看代码去找继承关系,一
141 # 定要看MRO列表)
可见 super完全按照__mro__的顺序来执行。