python中class類的繼承 多繼承及super()

  • python中class的繼承
class Person(object):
    number = 61

    def __init__(self):
        self.name = '小明'
        self.age = 18
        self.gender = '男'

    def func(self):
        pass


class Student(Person):
    def eat(self):
        print('chi')

stu1 = Student()
print(stu1.name, stu1.func(), stu1.age, stu1.eat(), stu1.gender, stu1.number)

如上所示,Student類繼承了Person類,并獲得了Person的所有字段,屬性,及方法
對(duì)于定義的每一個(gè)類,Python會(huì)計(jì)算出解析順序(mro)列表
class.mro可以查看

  • 多繼承
    如果一個(gè)類繼承多個(gè)父類的情況下,會(huì)合并所有父類的mro并遵從下列原則:
  1. 子類會(huì)先于父類被檢查
  2. 多個(gè)父類會(huì)根據(jù)它們在列表中的順序被檢查
  3. 如果對(duì)下一個(gè)類存在兩個(gè)合法的選擇,選擇第一個(gè)父類
  • 子類屬性,方法基于父類的重寫及 super()的使用
    如果子類某些在父類屬性基礎(chǔ)上擴(kuò)充則需要重新定義init()
    經(jīng)典的菱形繼承
    20190115210205895.png

    注意:
    子類的對(duì)象屬性不能超過其各個(gè)父類屬性個(gè)數(shù)的最大值,如果不同父類有不同的屬性定義, 子類需要全部繼承時(shí),需要使用*arges, **kwarges 不定長參數(shù) 使父類的屬性個(gè)數(shù)不定長,此時(shí)子類繼承時(shí)能獲得所有的屬性
class Father(object):

    def __init__(self, name, *arges, **kwargs):
        self.name = name
        super().__init__(*arges, **kwargs)


class Motner(object):

    def __init__(self, age, *arges, **kwargs):
        self.age = age
        super().__init__(*arges, **kwargs)


class Student(Father, Motner):
    def __init__(self, name, age):
        super().__init__(name, age)

print(Student.__mro__)
stu1 = Student('asd', 18)
print(stu1.age)
print(stu1.name)
#結(jié)果
(<class '__main__.Student'>, <class '__main__.Father'>, <class '__main__.Motner'>, <class 'object'>)
18
asd
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容