繼承是一種新建類的方式,新建的類稱爲子類,被繼承的類稱爲父類編程
繼承的特性是:子類會遺傳父類的屬性編程語言
繼承是類與類之間的關係設計
class Parent1: pass class Parent2: pass class Sub1(Parent1, Parent2): pass
print(Sub1.__bases__)
(<class '__main__.Parent1'>, <class '__main__.Parent2'>)
在Python3中若是一個類沒有繼承任何類,則默認繼承object類code
在Python2中若是一個類沒有繼承任何類,不會繼承object類對象
print(Parent1.__bases__)
(<class 'object'>,)
繼承了object的類以及該類的子類,都是新式類blog
Python3中全部的類都是新式類繼承
沒有繼承object的類以及該類的子類,都是經典類it
只有Python2中才有經典類class
繼承描述的是子類與父類之間的關係,是一種什麼是什麼的關係。要找出這種關係,必須先抽象再繼承,抽象即抽取相似或者說比較像的部分。
抽象分紅兩個層次:
將奧巴馬和梅西這倆對象比較像的部分抽取成類;
將人,豬,狗這三個類比較像的部分抽取成父類。
抽象最主要的做用是劃分類別(能夠隔離關注點,下降複雜度),以下圖所示:
繼承:基於抽象的結果,經過編程語言去實現它,確定是先經歷抽象這個過程,才能經過繼承的方式去表達出抽象的結構。
抽象只是分析和設計的過程當中,一個動做或者說一種技巧,經過抽象能夠獲得類,以下圖所示:
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}
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