繼承、多態、多態性

1.什麼是繼承?繼承是一種建立新的類的方式

class A:
    pass
    
class B(A):
    pass

2.如何繼承-》如何尋找繼承關係

繼承是一種‘是’的關係:

人類、豬類、狗類都繼承動物類,於是他們都是動物

3.爲何要用繼承?

解決代碼重用問題?
解決的是:什麼是什麼的問題-》繼承

4.派生:子類繼承了父類的屬性,而後衍生出本身新的屬性,

若是子類衍生出的新的屬性與父類的某個屬性名字相同,
    那麼再調用子類的這個屬性,就以子類本身這裏的爲準了

5.在子類中重用父類的函數:父類名.父類的函數(參數)或者super

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()

6.組合對比繼承來講,也是用來重用代碼,可是組合描述的是一種「有」的關係

老師有課程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)

繼承:

python3中只有新式類。遵循:廣度優先。

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

python2中有經典類又有新式類。經典類遵循:深度優先。

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()方法

優先找完一整條路,再找另一條。

相關文章
相關標籤/搜索