class A: pass class B(A): pass
繼承是一種‘是’的關係: 人類、豬類、狗類都繼承動物類,於是他們都是動物
解決代碼重用問題? 解決的是:什麼是什麼的問題-》繼承
若是子類衍生出的新的屬性與父類的某個屬性名字相同, 那麼再調用子類的這個屬性,就以子類本身這裏的爲準了
class A: def test(self): print("This is A !") class B(A): def test(self): A.test(B) #super().test() #若是在python2中super須要跟參數:super(B,self).test() print("This is B !") b=B() b.test()
老師有課程python
學生有成績函數
學生有課程code
學校有老師繼承
學校有學生接口
class Course: def __init__(self,name,price,period): self.name=name self.price=price self.period=period class Teacher: def __init__(name,course): self.name=name self.course=course class Student: def __init__(name,course): self.name=name self.course=course python=Course('python',15800,'7m') t1=Teacher('egon',python) s1=Student('alex',python) print(s1.course.name) print(s1.course.period)
class Animal: def run(self): raise AttributeError('子類必須實現這個方法') class People(Animal): def run(self): print('人正在走') class Pig(Animal): def run(self): print('pig is walking') class Dog(Animal): def run(self): print('dog is running') peo1=People() pig1=Pig() d1=Dog() peo1.run() pig1.run() d1.run()
def func(obj): obj.run() func(peo1) func(pig1) func(d1) 多態性依賴於: 1.繼承 2. 多態性:定義統一的接口, def func(obj): #obj這個參數沒有類型限制,能夠傳入不一樣類型的值 obj.run() #調用的邏輯都同樣,執行的結果卻不同 func(peo1) func(pig1) func(d1)
class A(object): def test(self): print('from A') pass class B(A): def test(self): print('from B') pass class C(A): def test(self): print('from C') pass class D(B): def test(self): print('from D') pass class E(C): def test(self): print('from E') pass class F(D,E): def test(self): print('from F') pass f1=F() f1.test() print(F.__mro__) #會返回繼承順序的一個列表 print(F.mro()) #同上 #廣度優先:F->D->B->E->C->A->object 會找到倒數第二層,再找其餘分支,所有分支找完再找最底層,2
class A: def test(self): print('from A') pass class B(A): def test(self): print('from B') pass class C(A): def test(self): print('from C') pass class D(B): def test(self): print('from D') pass class E(C): def test(self): print('from E') pass class F(D,E): def test(self): print('from F') pass f1=F() f1.test() #深度優先 F->D->B->A->E->C 經典類中沒有mro()方法 優先找完一整條路,再找另一條。