Python面向?qū)ο缶幊獭鄳B(tài)、多態(tài)性、鴨子類型
一、多態(tài)
多態(tài)指的是一類事物有多種形態(tài),比如
動物有多種形態(tài):人,狗,豬
import abc
class Animal(metaclass=abc.ABCMeta): #同一類事物:動物
@abc.abstractmethod
def talk(self):
pass
class People(Animal): #動物的形態(tài)之一:人
def talk(self):
print('say hello')
class Dog(Animal): #動物的形態(tài)之二:狗
def talk(self):
print('say wangwang')
class Pig(Animal): #動物的形態(tài)之三:豬
def talk(self):
print('say aoao')
文件有多種形態(tài):文本文件,可執(zhí)行文件
import abc
class File(metaclass=abc.ABCMeta): #同一類事物:文件
@abc.abstractmethod
def click(self):
pass
class Text(File): #文件的形態(tài)之一:文本文件
def click(self):
print('open file')
class ExeFile(File): #文件的形態(tài)之二:可執(zhí)行文件
def click(self):
print('execute file')
二、多態(tài)性
1、什么是多態(tài)動態(tài)綁定(在繼承的背景下使用時,有時也稱為多態(tài)性)
多態(tài)性是指在不考慮實例類型的情況下使用實例,多態(tài)性分為靜態(tài)多態(tài)性和動態(tài)多態(tài)性
靜態(tài)多態(tài)性:如任何類型都可以用運(yùn)算符+進(jìn)行運(yùn)算
動態(tài)多態(tài)性:如下
peo=People()
dog=Dog()
pig=Pig()
#peo、dog、pig都是動物,只要是動物肯定有talk方法
#于是我們可以不用考慮它們?nèi)叩木唧w是什么類型,而直接使用
peo.talk()
dog.talk()
pig.talk()
#更進(jìn)一步,我們可以定義一個統(tǒng)一的接口來使用
def func(obj):
obj.talk()
2、為什么要用多態(tài)性(多態(tài)性的好處)
其實大家從上面多態(tài)性的例子可以看出,我們并沒有增加什么新的知識,也就是說python本身就是支持多態(tài)性的,這么做的好處是什么呢?
1、增加了程序的靈活性
以不變應(yīng)萬變,不論對象千變?nèi)f化,使用者都是同一種形式去調(diào)用,如func(animal)
2、增加了程序額可擴(kuò)展性
通過繼承animal類創(chuàng)建了一個新的類,使用者無需更改自己的代碼,還是用func(animal)去調(diào)用
>>> class Cat(Animal): #屬于動物的另外一種形態(tài):貓
... def talk(self):
... print('say miao')
...
>>> def func(animal): #對于使用者來說,自己的代碼根本無需改動
... animal.talk()
...
>>> cat1=Cat() #實例出一只貓
>>> func(cat1) #甚至連調(diào)用方式也無需改變,就能調(diào)用貓的talk功能
say miao
'''
這樣我們新增了一個形態(tài)Cat,由Cat類產(chǎn)生的實例cat1,使用者可以在完全不需要修改自己代碼的情況下。使用和人、狗、豬一樣的方式調(diào)用cat1的talk方法,即func(cat1)
'''
三、鴨子類型
逗比時刻:
Python崇尚鴨子類型,即‘如果看起來像、叫聲像而且走起路來像鴨子,那么它就是鴨子’
python程序員通常根據(jù)這種行為來編寫程序。例如,如果想編寫現(xiàn)有對象的自定義版本,可以繼承該對象
也可以創(chuàng)建一個外觀和行為像,但與它無任何關(guān)系的全新對象,后者通常用于保存程序組件的松耦合度。
例1:利用標(biāo)準(zhǔn)庫中定義的各種‘與文件類似’的對象,盡管這些對象的工作方式像文件,但他們沒有繼承內(nèi)置文件對象的方法。
#二者都像鴨子,二者看起來都像文件,因而就可以當(dāng)文件一樣去用
class TxtFile:
def read(self):
pass
def write(self):
pass
class DiskFile:
def read(self):
pass
def write(self):
pass
例2:序列類型有多種形態(tài):字符串,列表,元組,但他們直接沒有直接的繼承關(guān)系
#str,list,tuple都是序列類型
s=str('hello')
l=list([1,2,3])
t=tuple((4,5,6))
#我們可以在不考慮三者類型的前提下使用s,l,t
s.__len__()
l.__len__()
t.__len__()
len(s)
len(l)
len(t)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
