Python类中继承与多继承

206 阅读2分钟

「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

面向对象三要素之一,继承!

继承:

可以处理功能的迭代更新,以及拓展
重用代码,方便代码的管理和修改。

在面向对象的世界中,从父类继承,就可以直接拥有父类的属性和方法,这样可以减少代码,多复用,子类可以定义自己的属性和方法

类名.bases 可以查看类的父类有哪些,注意要print。

每一个类,如果你不写继承,那么这个类继承的就是object。

class Father(object):          #object默认自动创建了__init__初始化方法
        #父类
        pass 

fa = Father()          #实例,自动调用父类的__init__  初始化方法就叫做继承。

例子:

class Father:       父类

        def eat(self):
                print('大吃一顿')

class Son1(Father):         #子类Son1继承父类Father
        pass

hansha = Son1()           
hansha.eat()               #子类Son1可以使用父类Father中的eat方法。

高级的来咯!!!

多继承:::

多继承优先级:从左往右,优先级由高到低。
如果继承的两个父类有同样的方法,那么会选择优先级高的方法,即子类会优先使用最先被继承的方法。

class Father:
        def __init__(self,name,age):
                self.name = name

        def eat(self):
                print('大吃一顿')


class Mother:
        def __init__(self,name,age,sex):
                self.name = name

        def cook(self):
                print('做菜')

class Son(Father,Mother):
        pass


hansha = Son('寒沙',18)
hansha.eat()
hansha.cook()

最高级的来啦!!!

class Base:
    def play(self):
        print('这是Base')

class A(Base):
    def play(self):
        print('这是A')
        super().play()       #这里调用的是Base

class B(Base):
    def play(self):
        print('这是B')
        super().play()      #这里调用的是Base

class C(A,B):
    #当子类继承父类之后,如果子类不想使用父类的方法,可以通过重写来覆盖父类的方法
    def play(self):
        print('这是C')
    # #重写父类方法之后,如果又需要使用父类的方法:
    #     B().play()    #第一种方法      实例化,再使用方法
    #     A.play(self)  #第二种方法      类名使用这个方法
        super().play()      #这里调用的是A
c = C()
c.play()
print(C.__mro__)    #可以通过调用类的__mro__属性或者mro方法来查看类的继承关系

输出为(<class 'main.C'>, <class 'main.A'>, <class 'main.B'>, <class 'main.Base'>, <class 'object'>)

super可以使用父类的方法;在父类中也可以使用super函数;要满足mro算法规则
根据mro的顺序来决定调用的是谁

在python3中,类被创建时会自动创建方法解析顺序mro

mro顺序 算法 保证程序能够按序执行。

mro顺序的作用:
#保证所有的类在用(构造)他的时候只被用(构造)一次!
保证多继承的时候,每个类只出现一次。
super().init() 相当于使用了mro。