从零开始的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中找,找不到再从他们的父类中找。

如果在子类中需要使用父类中已经被重写的方法,则可以通过

类名.方法名()

的方法调用。

原文地址:https://www.cnblogs.com/smilepup-hhr/p/10341886.html