class A: def f1(self): print('A,f1') def f3(self): print('A,f3') class B(A): def f1(self): print('B.f1') def f4(self): print('B.f4') class C1(B): def f1(self): print('C1.f1') def f2(self): print('C1.f2') class C2(A): def f1(self): print('C2.f1') def c2(self): self.f1() class D(C1,C2): def d1(self): print('D.d1') def d2(self): print('D.d2') def f1(self): #方法的重写,这样可以不继承父类的同名方法 super(D,self).f1() #但如果想调用父类同名方法,可以在前面super C1.f1(self) #调用父类同名方法,也可以用写父类名.方法名(self)方式 C2.f1(self) print('D.f1') obj = D() obj.d1() print('1=================================================') obj.d2() print('2=================================================') obj.f1() #声明D类时,父类C1比父类C2写在前面,所以C1、C2都有f1方法情况下,先调用C1的 print('3=================================================') obj.c2() #C2是D的其中一个父类,且c2这个方法只有C2类才有,所以调用c2方法时是找到了C2类里的c2方法 #C2类里c2方法调用了self.f1(),这里的self是指调用对象obj本身而不是C2这个类,所以调用的是D下的f1方法而不是C2下的f1方法,所以输出结果不是C2.f1 print('4=================================================') obj.f3() print('5=================================================') obj.f4()
输出:
D.d1
1=================================================
D.d2
2=================================================
C1.f1
C1.f1
C2.f1
D.f1
3=================================================
C1.f1
C1.f1
C2.f1
D.f1
4=================================================
A,f3
5=================================================
B.f4