目錄
二、多型性
三、多型性的好處
四、小結
很多人喜歡將多型與多型性二者混為一談,然後百思不得其解,其實只要分開看,就會很明朗。
多型指的是一類事物有多種形態,(乙個抽象類有多個子類,因而多型的概念依賴於繼承)
序列資料型別有多種形態:字串,列表,元組
動物有多種形態:人,狗,豬
# 動物有多種形態:人類、豬、狗
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()
# 人正在走
# pig is walking
# dog is running
import abc
class animal(metaclass=abc.abcmeta): # 同一類事物:動物
@abc.abstractmethod # 上述**子類是約定俗稱的實現這個方法,加上@abc.abstractmethod裝飾器後嚴格控制子類必須實現這個方法
def talk(self):
raise attributeerror('子類必須實現這個方法')
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')
peo2 = people()
pig2 = pig()
d2 = dog()
peo2.talk()
pig2.talk()
d2.talk()
# say hello
# say aoao
# say wangwang
1.2 檔案的多種形態
import abc
class file(metaclass=abc.abcmeta): # 同一類事物:檔案
@abc.abstractmethod
def click(self):
pass
class text(file): # 檔案的形態之一:文字檔案
def click(self):
print('open file')
class exefile(file): # 檔案的形態之二:可執行檔案
def click(self):
print('execute file')
text = text()
exe_file = exefile()
text.click()
exe_file.click()
open file
execute file
注意:多型與多型性是兩種概念
多型性是指具有不同功能的函式可以使用相同的函式名,這樣就可以用乙個函式名呼叫不同內容的函式。在物件導向方法中一般是這樣表述多型性:向不同的物件傳送同一條訊息,不同的物件在接收時會產生不同的行為(即方法)。也就是說,每個物件可以用自己的方式去響應共同的訊息。所謂訊息,就是呼叫函式,不同的行為就是指不同的實現,即執行不同的函式。
# 多型性:一種呼叫方式,不同的執行效果(多型性)
def func(obj):
obj.run()
func(peo1)
func(pig1)
func(d1)
# 人正在走
# pig is walking
# dog is running
# 多型性依賴於:繼承
# 多型性:定義統一的介面
def func(obj): # obj這個引數沒有型別限制,可以傳入不同型別的值
obj.talk() # 呼叫的邏輯都一樣,執行的結果卻不一樣
func(peo2)
func(pig2)
func(d2)
# say hello
# say aoao
# say wangwang
def func(obj):
obj.click()
func(text)
func(exe_file)
open file
execute file
def func(obj):
print(len(obj))
func('hello')
func([1, 2, 3])
func((1, 2, 3))
#5#3
#3
綜上可以說,多型性是乙個介面(函式func)的多種實現(如obj.run(),obj.talk(),obj.click(),len(obj))
其實大家從上面多型性的例子可以看出,我們並沒有增加新的知識,也就是說python本身就是支援多型性的,這麼做的好處是什麼呢?
增加了程式的靈活性:以不變應萬變,不論物件千變萬化,使用者都是同一種形式去呼叫,如func(animal)
增加了程式額可擴充套件性:通過繼承animal類建立了乙個新的類,使用者無需更改自己的**,還是用func(animal)去呼叫
class cat(animal): # 屬於動物的另外一種形態:貓
def talk(self):
print('say miao')
def func(animal): # 對於使用者來說,自己的**根本無需改動
animal.talk()
cat1 = cat() # 例項出乙隻貓
func(cat1) # 甚至連呼叫方式也無需改變,就能呼叫貓的talk功能
#say miao
多型:同一種事物的多種形態,動物分為人類,豬類(在定義角度)
多型性:一種呼叫方式,不同的執行效果(多型性)
類的多型與多型性
多型是指一類事物有多種形態 class animal def speak self print f 開口說話 動物的形態之一 人 class people animal def speak self print 呵呵呵 動物的形態之二 狗 class duck animal def speak se...
類的多型性
類的多型 多型就是指在程式執行時,執行的雖然是乙個呼叫方法的語句,卻可以根據派生類物件的型別的不同完成方法不同的具體實現 當派生類從基類繼承時,它會獲得積累的所有方法,字段,屬性,和事件.派生類可以選擇 1.繼承最接近的基類方法而不是重寫它 2.重寫基類中的虛擬成員.3.定義隱藏類實現的成員的新非虛...
Python多型和多型性
python多型和多型性 python 中的多型是指一類事務有多種形態。比如動物有多種形態,人,狗,貓,等等。import abc class animal metaclass abc.abcmeta 同一類事物 動物 abc.abstractmethod def talk self pass cl...