python多型的表現形式 多型與鴨子型別

2021-10-17 02:41:02 字數 2078 閱讀 5516

[toc]

## 多型

多型指的是一類事物有多種形態,比如

動物有多種形態:人,狗,豬

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

## 多型性

### **什麼是多型動態繫結(多型性)**

多型性是指在不考慮例項型別的情況下使用例項,多型性分為靜態多型性和動態多型性

* 靜態多型性:如任何型別都可以用運算子+進行運算

* 動態多型性:如下

peo=people()

dog=dog()

pig=pig()

#peo、dog、pig都是動物,只要是動物肯定有talk方法

#於是我們可以不用考慮它們三者的具體是什麼型別,而直接使用

peo.talk()

dog.talk()

pig.talk()

#更進一步,我們可以定義乙個統一的介面來使用

def func(obj):

obj.talk()

### **為什麼要用多型性**

從上面多型性的例子可以看出,python本身就是支援多型性的,這麼做的好處是什麼呢?

1. 增加了程式的靈活性

以不變應萬變,不論物件千變萬化,使用者都是同一種形式去呼叫,如func(animal)

2. 增加了程式額可擴充套件性

通過繼承animal類建立了乙個新的類,使用者無需更改自己的**,還是用func(animal)去呼叫

>>> class cat(animal): #屬於動物的另外一種形態:貓

... def talk(self):

... print('say miao')

>>> def func(animal): #對於使用者來說,自己的**根本無需改動

... animal.talk()

>>> cat1=cat() #例項出乙隻貓

>>> func(cat1) #甚至連呼叫方式也無需改變,就能呼叫貓的talk功能

say miao

>新增了乙個形態cat,由cat類產生的例項cat1,使用者可以在完全不需要修改自己**的情況下。使用和人、狗、豬一樣的方式呼叫cat1的talk方法,即func(cat1)

## 鴨子型別

python崇尚鴨子型別,即『如果看起來像、叫聲像而且走起路來像鴨子,那麼它就是鴨子』

python程式設計師通常根據這種行為來編寫程式。例如,如果想編寫現有物件的自定義版本,可以繼承該物件,也可以建立乙個外觀和行為像,但與它無任何關係的全新物件,後者通常用於儲存程式元件的松耦合度。

* 例1:

利用標準庫中定義的各種『與檔案類似』的物件,儘管這些物件的工作方式像檔案,但他們沒有繼承內建檔案物件的方法

#二者都像鴨子,二者看起來都像檔案,因而就可以當檔案一樣去用

class txtfile:

def read(self):

pass

def write(self):

pass

class diskfile:

def read(self):

pass

def write(self):

pass

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

#str,list,tuple都是序列型別

s=str('hello')

l=list([1,2,3])

t=tuple((4,5,6))

#我們可以在不考慮三者型別的前提下使用s,l,t的len方法

s.__len__()

l.__len__()

t.__len__()

多型的表現形式

目錄 1.多型的定義 2.多型的三種形式 3.多型的編譯和執行 4.多型的轉型 5.多型的好處 6.多型的弊端 多型 封裝和繼承是物件導向的三大特性。多型需滿足三個條件 1 有繼承 2 有重寫 3 有父類引用指向子類物件。最終多型體現為父類引用可以指向子類物件 父類型別 變數名 new 子類型別 1...

多型有幾種表現形式

1 方法的過載 通常是指在同乙個類中,相同的方法名對應著不同的方法實現,這些方法名相同的方法其區別在於他們的引數不同 2 方法的重寫 方法的重寫主要用於父類和子類之間,子類重寫父類的方法,只是對應的方法實現不同,方法名和方法引數都相同 3 抽象類 在物件導向語言中,乙個類中的方法只給出了標準,而沒有...

多型的四種表現形式

在之前一提到多型,我下意識就是虛函式重寫構成的執行時多型。直到看了一篇文章,才反應過來多型有四種表現形式。cpp polymorphism 執行時多型就是派生類重寫基類的虛函式,在呼叫函式裡,引數為基類的指標或引用,會構成多型。我之前寫過一篇多型的原理,就是在講多型 執行時多型 在底層是怎麼實現的 ...