从零开始的Python学习Episode 19——面向对象(2)
面向对象之继承
继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称
为基类或超类,新建的类称为派生类或子类。
子类会“”遗传”父类的属性,从而解决代码重用问题。
单继承与多继承
class Par1: pass class Par2: pass class ch1(Par1):#单继承 pass class ch2(Par1,Par2):#多继承 pass
派生中方法调用的规则
子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。
但在多继承中情况就会稍微有点复杂,因为如果两个父类中有相同名字的方法的话,子类会调用哪一个?
试验:
class Par1(): def f1(self): print('this is par1.f1') class Par2(): def f1(self): print('this is par2.f1') class ch2(Par1,Par2): pass obj = ch2() obj.f1() #输出:this is par1.f1
class Par1(): def f2(self): print('this is par1.f1') class Par2(): def f1(self): print('this is par2.f1') class ch2(Par1,Par2): pass obj = ch2() obj.f1() #输出:this is par2.f1
看来是优先在第一个父类中找,找不到再找下一个。
class Grandpar: def f1(self): print('this is grandpar.f1') class Par1(Grandpar): def f2(self): print('this is par1.f1') class Par2(Grandpar): def f1(self): print('this is par2.f1') class ch2(Par1,Par2): pass obj = ch2() obj.f1() #输出:this is par2.f1
class Grandpar: def f1(self): print('this is grandpar.f1') class Par1(Grandpar): def f2(self): print('this is par1.f1') class Par2(Grandpar): def f2(self): print('this is par2.f1') class ch2(Par1,Par2): pass obj = ch2() obj.f1() #输出:this is grandpar.f1
当父类还有父类的时候,会先在Par1,Par2中找,找不到再从他们的父类中找。
如果在子类中需要使用父类中已经被重写的方法,则可以通过
类名.方法名()
的方法调用。