1. 程式人生 > >面向對象 -- 三大特性之多態

面向對象 -- 三大特性之多態

vip 利用 創建 計算 如果 self 產生 行為 基礎

在python當中 處處是多態 一切皆對象

廣義的多態

一個類能表現出的多種形態

木頭 桌子 板凳

用戶 vip用戶 svip用戶

在面向對象方法中一般是這樣表述多態性:
向不同的對象發送同一條消息(!!!obj.func():是調用了obj的方法func,又稱為向obj發送了一條消息func),不同的對象在接收時會產生不同的行為(即方法)。
也就是說,每個對象可以用自己的方式去響應共同的消息。所謂消息,就是調用函數,不同的行為就是指不同的實現,即執行不同的函數。

比如:老師.下課鈴響了(),學生.下課鈴響了(),老師執行的是下班操作,學生執行的是放學操作,雖然二者消息一樣,但是執行的效果不同

peo=People()
dog=Dog()
pig=Pig()

#peo、dog、pig都是動物,只要是動物肯定有talk方法
#於是我們可以不用考慮它們三者的具體是什麽類型,而直接使用
peo.talk()
dog.talk()
pig.talk()

#更進一步,我們可以定義一個統一的接口來使用
def func(obj):
    obj.talk()

在其它語言中

在傳遞參數時,如果要傳遞的對象有可能是多個類的對象

我們又必須在語言中清楚的描述出到底是哪一個類的對象

我們就可以使用繼承的方式

有一個父類作為這些所有可能被傳遞進的對象的基類

基礎類型就可以寫成這個父類

於是所有子類的對象都屬於父類

在python中

在python中因為要傳遞對象的類型在定義階段不需明確,所以在python中處處是多態

數據類型不需要繼承來維護統一

鴨子類型

python當中寫程序的一種特殊的情況

Python崇尚鴨子類型,即‘如果看起來像、叫聲像而且走起路來像鴨子,那麽它就是鴨子’

python程序員通常根據這種行為來編寫程序。例如,如果想編寫現有對象的自定義版本,可以繼承該對象

也可以創建一個外觀和行為像,但與它無任何關系的全新對象,後者通常用於保存程序組件的松耦合度。

例1:

利用標準庫中定義的各種‘與文件類似’的對象,盡管這些對象的工作方式像文件,但他們沒有繼承內置文件對象的方法

例2:序列類型有多種形態:字符串,列表,元組,但他們直接沒有直接的繼承關系

#二者都像鴨子,二者看起來都像文件,因而就可以當文件一樣去用
class TxtFile:
    def read(self):
        pass

    def write(self):
        pass

class DiskFile:
    def read(self):
        pass
    def write(self):
        pass

其他語言中 正常的我們說一個數據類型具有某個特點,通常是通過繼承來實現

繼承叠代器類,來證明自己本身是個叠代器

繼承可哈希的類,來證明自己本事是可哈希的

但是所有的這些都不是通過繼承來完成的

我們只是通過一種潛規則的約定,如果具有__iter__,__next__就是叠代器

如果具有__hash__方法就是可哈希

如果具有__len__就是可以計算長度的

這樣數據類型之間的關系並不僅僅是通過繼承來約束的

而是通過約定俗成的關系來確認的

面向對象 -- 三大特性之多態