一、什么是繼承
-
繼承是一種新建類的方式,新建的類稱為子類,被繼承的類稱為父類
-
繼承的特性是:子類會遺傳父類的屬性
-
繼承是類與類之間的關系
二、為什么用繼承
- 使用繼承可以減少代碼的冗余
三、對象的繼承
- 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中才有經典類
五、繼承與抽象
繼承描述的是子類與父類之間的關系,是一種什么是什么的關系。要找出這種關系,必須先抽象再繼承,抽象即抽取類似或者說比較像的部分。
抽象分成兩個層次:
-
將奧巴馬和梅西這倆對象比較像的部分抽取成類;
-
將人,豬,狗這三個類比較像的部分抽取成父類。
抽象最主要的作用是划分類別(可以隔離關注點,降低復雜度),如下圖所示:
繼承:基於抽象的結果,通過編程語言去實現它,肯定是先經歷抽象這個過程,才能通過繼承的方式去表達出抽象的結構。
抽象只是分析和設計的過程中,一個動作或者說一種技巧,通過抽象可以得到類,如下圖所示:
六、繼承的應用
- 牢記對象是特征與功能的集合體,我們可以拿選課系統舉例
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')
- 對象查找屬性的順序:對象自己-》對象的類-》父類-》父類。。。
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