菜鳥學python第二十四天(面向物件三大特性之多型)
阿新 • • 發佈:2018-12-18
面向物件三大特性之多型
-
什麼是多型
不同物件響應同一種方法的表現出不同的行為,產生不同的結果
用基類建立一套統一的規則,強制子類去遵循(使用抽象類實現),這樣便可以 在不用考慮物件具體型別的前提下而直接使用物件下的方法
-
為什麼要有多型
-
增加了程式的靈活性
以不變應萬變,不論物件千變萬化,使用者都是以同一種形式去呼叫,如func(animal)
-
提高程式的拓展性
通過繼承animal類建立了一個新的類,使用者無需更改自己的程式碼,還是用func(animal)去呼叫
-
-
怎麼用多型
讓幾個不同的類擁有相同的父類,繼承了相同的方法,然後重新定義其方法,這樣用相同的方法就能產生不同的結果.
class Animal: def eat(self): print('動物在吃草') class Person(Animal): def eat(self): # 定義人的方法 print('人吃糧食...') class Pig(Animal): def eat(self): # 定義豬的方法 print('豬吃飼料...') class Dog(Animal): def eat(self): #定義狗的方法 print('狗吃骨頭...') #產生物件 person = Person() pig = Pig() dog = Dog() # 呼叫不同物件的同一方法,產生不同結果(多型性的體現) peo.talk() dog.talk() pig.talk() def func(animal): # 可以進一步封裝成一個介面,傳入什麼物件就呼叫它的方法 animal.eat() func(pig)
-
abc模組
abstract的縮寫 ,抽象的意思
-
使用ABC模組的步驟
-
為類中指定元類為metaclass = abc.ABCMeta
-
在相應的方法上加上@abc.abstractmethod
-
import abc class Animal(metaclass=abc.ABCMeta): #同一類事物:動物 @abc.abstractmethod def talk(self): pass class People(Animal): #動物的形態之一:人 def talk(self): print('say hello') class Dog(Animal): #動物的形態之二:狗 def talk(self): print('say wangwang') class Pig(Animal): #動物的形態之三:豬 def talk(self): print('say aoao') # 使用ABC裝飾器的目的,將基類變為抽象基類,嚴格要求子類物件必須使用基類中被裝飾的的方法,如果子類中沒有該方法則報錯.
-
-
鴨子型別
-
在現實中一個物體叫聲象鴨子,走路也像鴨子,那麼人們就把它當做鴨子
-
對應到程式設計中就是兩個獨立的類,沒有任何關聯,但是兩者的方法和 屬性都一致(長得像),那麼兩者就可以實現多型(不同物件響應同一種方法的表現出不同的行為,產生不同的結果).這就是鴨子型別.
-
# 類Foo和Bar都擁有兩種相同的方法,故兩者稱之為鴨子型別 class Foo: def f1(self): print('from foo.f1') def f2(self): print('from foo.f2') class Bar: def f1(self): print('from bar.f1') def f2(self): print('from bar.f2') obj1 = Foo() obj2 = Bar() # (obj1,obj2)不同物件針對同一方法(f1)產生不同的結果 obj1.f1() obj2.f1() # (obj1,obj2)不同物件針對同一方法(f2)產生不同的結果 obj1.f2() obj2.f2()