類的繼承


一、什么是繼承

  • 繼承是一種新建類的方式,新建的類稱為子類,被繼承的類稱為父類

  • 繼承的特性是:子類會遺傳父類的屬性

  • 繼承是類與類之間的關系

89-類的繼承-繼承.jpg?x-oss-process=style/watermark

二、為什么用繼承

  • 使用繼承可以減少代碼的冗余

三、對象的繼承

  • Python中支持一個類同時繼承多個父類
class Parent1:
    pass


class Parent2:
    pass


class Sub1(Parent1, Parent2):
    pass
  • 使用__bases__方法可以獲取對象繼承的類
print(Sub1.__bases__)
(<class '__main__.Parent1'>, <class '__main__.Parent2'>)
  • 在Python3中如果一個類沒有繼承任何類,則默認繼承object類

  • 在Python2中如果一個類沒有繼承任何類,不會繼承object類

print(Parent1.__bases__)
(<class 'object'>,)

四、類的分類

  • 后面會詳細解釋類的分類,目前僅做了解

4.1 新式類

  • 繼承了object的類以及該類的子類,都是新式類

  • Python3中所有的類都是新式類

4.2 經典類

  • 沒有繼承object的類以及該類的子類,都是經典類

  • 只有Python2中才有經典類

五、繼承與抽象

繼承描述的是子類與父類之間的關系,是一種什么是什么的關系。要找出這種關系,必須先抽象再繼承,抽象即抽取類似或者說比較像的部分。

抽象分成兩個層次:

  1. 將奧巴馬和梅西這倆對象比較像的部分抽取成類;

  2. 將人,豬,狗這三個類比較像的部分抽取成父類。

抽象最主要的作用是划分類別(可以隔離關注點,降低復雜度),如下圖所示:

89-類的繼承-抽象圖.png?x-oss-process=style/watermark

繼承:基於抽象的結果,通過編程語言去實現它,肯定是先經歷抽象這個過程,才能通過繼承的方式去表達出抽象的結構。

抽象只是分析和設計的過程中,一個動作或者說一種技巧,通過抽象可以得到類,如下圖所示:

89-類的繼承-繼承圖.png?x-oss-process=style/watermark

六、繼承的應用

  • 牢記對象是特征與功能的集合體,我們可以拿選課系統舉例
class OldboyPeople:
    """由於學生和老師都是人,因此人都有姓名、年齡、性別"""
    school = 'oldboy'

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender


class OldboyStudent(OldboyPeople):
    def choose_course(self):
        print('%s is choosing course' % self.name)


class OldboyTeacher(OldboyPeople):
    def score(self, stu_obj, num):
        print('%s is scoring' % self.name)
        stu_obj.score = num


stu1 = OldboyStudent('tank', 18, 'male')
tea1 = OldboyTeacher('nick', 18, 'male')
  • 對象查找屬性的順序:對象自己-》對象的類-》父類-》父類。。。

89-類的繼承-查找.jpg?x-oss-process=style/watermark

print(stu1.school)
oldboy
print(tea1.school)
oldboy
print(stu1.__dict__)
{'name': 'tank', 'age': 18, 'gender': 'male'}
tea1.score(stu1, 99)
nick is scoring
print(stu1.__dict__)
{'name': 'tank', 'age': 18, 'gender': 'male', 'score': 99}

6.1 屬性查找練習

class Foo:
    def f1(self):
        print('Foo.f1')

    def f2(self):
        print('Foo.f2')
        self.f1()


class Bar(Foo):
    def f1(self):
        print('Bar.f1')


# 對象查找屬性的順序:對象自己-》對象的類-》父類-》父類。。。
obj = Bar()  # self是obj本身,即找到Bar的f1()
obj.f2()
Foo.f2
Bar.f1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM