此代码仅适用于python3.4。
super([type[, object-or-type]])
super在python3中有变化,所以并不适用于python2.
python3中的第二个参数是实例,python2中的第二个参数是class type
-----------华丽的分割线--------------
先说下代码结构,然后你就可以不用看代码了:
声明A,B,C类。各有plus和minus函数,调用时会打印“plus/minus in A”
class F(A,B,C)一个继承。
这样继承下来,最终结果就是我们的新类F中的函数都被A中的函数覆写了。那我们想调用B/C中的方法的时候应该怎么做?
下面是方法:
-----------华丽的分割线--------------
啰嗦也没人看,我也不喜欢,直接代码说话,下面是构建的代码
class A:
def plus(self):
print('plus in a')
class B:
def plus(self):
print('plus in b')
def minus(self):
print('minus in b')
class C:
def plus(self):
print('plus in c')
def minus(self):
print('minus in c')
class F(A, B, C):
pass
a = F()
-----------华丽的分割线--------------
下面是应用:
a.plus()
a.minus()
结果:
plus in a
minus in b
-----------华丽的分割线--------------
奇怪的来了:
super(A,a).plus()
super(B,a).minus()
结果:
plus in b
minus in c
-----------华丽的分割线--------------
实际上在建立子类的时候里面已经包含了继承树:
C->B->A->F
也就是说,其实对F实例化的对象来说,F的父类是A,而A的父类是B,B的父类是C
这样理解super也许就简单了:
super(type,instance)
type:当然就是类名
instance:实例化的类
整个的意义就是在instance的树中,得到class type的父类。
所以,你想使用B的plus方法:
- 找到一个对象,F()
- 看F继承树中B的子类(A,从右到左)
- super(A,F()).plus()