Python面向?qū)ο笾涌?、抽象?lèi)與多態(tài)詳解
本文實(shí)例講述了Python面向?qū)ο笾涌凇⒊橄箢?lèi)與多態(tài)。分享給大家供大家參考,具體如下:
接口類(lèi)
繼承有兩種用途:
一:繼承基類(lèi)的方法,并且做出自己的改變或者擴(kuò)展(代碼重用)
二:聲明某個(gè)子類(lèi)兼容于某基類(lèi),定義一個(gè)接口類(lèi)Interface,接口類(lèi)中定義了一些接口名(就是函數(shù)名)且并未實(shí)現(xiàn)接口的功能,子類(lèi)繼承接口類(lèi),并且實(shí)現(xiàn)接口中的功能
接口主要是java等語(yǔ)言中的概念,python中并沒(méi)有明確的限定
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self,money):
pass
class Wechatpay(Payment):
def fuqian(self,money):
print('微信支付了%s元'%money)
p = Wechatpay() #不調(diào)就報(bào)錯(cuò)了
抽象類(lèi)
什么是抽象類(lèi)
與java一樣,python也有抽象類(lèi)的概念但是同樣需要借助模塊實(shí)現(xiàn),抽象類(lèi)是一個(gè)特殊的類(lèi),它的特殊之處在于只能被繼承,不能被實(shí)例化
為什么要有抽象類(lèi)
如果說(shuō)類(lèi)是從一堆對(duì)象中抽取相同的內(nèi)容而來(lái)的,那么抽象類(lèi)就是從一堆類(lèi)中抽取相同的內(nèi)容而來(lái)的,內(nèi)容包括數(shù)據(jù)屬性和函數(shù)屬性。
比如我們有香蕉的類(lèi),有蘋(píng)果的類(lèi),有桃子的類(lèi),從這些類(lèi)抽取相同的內(nèi)容就是水果這個(gè)抽象的類(lèi),你吃水果時(shí),要么是吃一個(gè)具體的香蕉,要么是吃一個(gè)具體的桃子。。。。。。你永遠(yuǎn)無(wú)法吃到一個(gè)叫做水果的東西。
從設(shè)計(jì)角度去看,如果類(lèi)是從現(xiàn)實(shí)對(duì)象抽象而來(lái)的,那么抽象類(lèi)就是基于類(lèi)抽象而來(lái)的。
從實(shí)現(xiàn)角度來(lái)看,抽象類(lèi)與普通類(lèi)的不同之處在于:抽象類(lèi)中只能有抽象方法(沒(méi)有實(shí)現(xiàn)功能),該類(lèi)不能被實(shí)例化,只能被繼承,且子類(lèi)必須實(shí)現(xiàn)抽象方法。這一點(diǎn)與接口有點(diǎn)類(lèi)似,但其實(shí)是不同的,即將揭曉答案
在python中實(shí)現(xiàn)抽象類(lèi)
import abc #利用abc模塊實(shí)現(xiàn)抽象類(lèi)
class All_file(metaclass=abc.ABCMeta):
all_type='file'
@abc.abstractmethod #定義抽象方法,無(wú)需實(shí)現(xiàn)功能
def read(self):
'子類(lèi)必須定義讀功能'
pass
@abc.abstractmethod #定義抽象方法,無(wú)需實(shí)現(xiàn)功能
def write(self):
'子類(lèi)必須定義寫(xiě)功能'
pass
# class Txt(All_file):
# pass
#
# t1=Txt() #報(bào)錯(cuò),子類(lèi)沒(méi)有定義抽象方法
class Txt(All_file): #子類(lèi)繼承抽象類(lèi),但是必須定義read和write方法
def read(self):
print('文本數(shù)據(jù)的讀取方法')
def write(self):
print('文本數(shù)據(jù)的讀取方法')
class Sata(All_file): #子類(lèi)繼承抽象類(lèi),但是必須定義read和write方法
def read(self):
print('硬盤(pán)數(shù)據(jù)的讀取方法')
def write(self):
print('硬盤(pán)數(shù)據(jù)的讀取方法')
class Process(All_file): #子類(lèi)繼承抽象類(lèi),但是必須定義read和write方法
def read(self):
print('進(jìn)程數(shù)據(jù)的讀取方法')
def write(self):
print('進(jìn)程數(shù)據(jù)的讀取方法')
wenbenwenjian=Txt()
yingpanwenjian=Sata()
jinchengwenjian=Process()
#這樣大家都是被歸一化了,也就是一切皆文件的思想
wenbenwenjian.read()
yingpanwenjian.write()
jinchengwenjian.read()
print(wenbenwenjian.all_type)
print(yingpanwenjian.all_type)
print(jinchengwenjian.all_type)
抽象類(lèi)與接口類(lèi)
抽象類(lèi)的本質(zhì)還是類(lèi),指的是一組類(lèi)的相似性,包括數(shù)據(jù)屬性(如all_type)和函數(shù)屬性(如read、write),而接口只強(qiáng)調(diào)函數(shù)屬性的相似性。
抽象類(lèi)是一個(gè)介于類(lèi)和接口直接的一個(gè)概念,同時(shí)具備類(lèi)和接口的部分特性,可以用來(lái)實(shí)現(xiàn)歸一化設(shè)計(jì)
在python中,并沒(méi)有接口類(lèi)這種東西,即便不通過(guò)專(zhuān)門(mén)的模塊定義接口,我們也應(yīng)該有一些基本的概念。
1. 多繼承問(wèn)題
在繼承抽象類(lèi)的過(guò)程中,我們應(yīng)該盡量避免多繼承;
而在繼承接口的時(shí)候,我們反而鼓勵(lì)你來(lái)多繼承接口
接口隔離原則:
使用多個(gè)專(zhuān)門(mén)的接口,而不使用單一的總接口。即客戶端不應(yīng)該依賴那些不需要的接口。
2. 方法的實(shí)現(xiàn)
在抽象類(lèi)中,我們可以對(duì)一些抽象方法做出基礎(chǔ)實(shí)現(xiàn);
而在接口類(lèi)中,任何方法都只是一種規(guī)范,具體的功能需要子類(lèi)實(shí)現(xiàn)
多繼承遍歷順序:
- 經(jīng)典類(lèi):深度優(yōu)先
- 新式類(lèi):廣度優(yōu)先
繼承的作用
- 減少代碼的重用
- 提高代碼可讀性
- 規(guī)范編程模式
抽象類(lèi)與接口類(lèi)
1.多繼承問(wèn)題
在繼承抽象類(lèi)的過(guò)程中,我們應(yīng)該盡量避免多繼承;
而在繼承接口的時(shí)候,我們反而鼓勵(lì)你來(lái)多繼承接口
2.方法的實(shí)現(xiàn)
在抽象類(lèi)中,我們可以對(duì)一些抽象方法做出基礎(chǔ)實(shí)現(xiàn);
而在接口類(lèi)中,任何方法都只是一種規(guī)范,具體的功能需要子類(lèi)實(shí)現(xiàn)
多態(tài)
多態(tài)指的是一類(lèi)事物有多種形態(tài)
多態(tài)性
一 什么是多態(tài)動(dòng)態(tài)綁定(在繼承的背景下使用時(shí),有時(shí)也稱為多態(tài)性)
多態(tài)性是指在不考慮實(shí)例類(lèi)型的情況下使用實(shí)例
多態(tài)性分為靜態(tài)多態(tài)性和動(dòng)態(tài)多態(tài)性
- 靜態(tài)多態(tài)性:如任何類(lèi)型都可以用運(yùn)算符+進(jìn)行運(yùn)算
- 動(dòng)態(tài)多態(tài)性:如下
peo=People() dog=Dog() pig=Pig() #peo、dog、pig都是動(dòng)物,只要是動(dòng)物肯定有talk方法 #于是我們可以不用考慮它們?nèi)叩木唧w是什么類(lèi)型,而直接使用 peo.talk() dog.talk() pig.talk() #更進(jìn)一步,我們可以定義一個(gè)統(tǒng)一的接口來(lái)使用 def func(obj): obj.talk()
鴨子類(lèi)型
Python崇尚鴨子類(lèi)型,即‘如果看起來(lái)像、叫聲像而且走起路來(lái)像鴨子,那么它就是鴨子'
python程序員通常根據(jù)這種行為來(lái)編寫(xiě)程序。例如,如果想編寫(xiě)現(xiàn)有對(duì)象的自定義版本,可以繼承該對(duì)象
也可以創(chuàng)建一個(gè)外觀和行為像,但與它無(wú)任何關(guān)系的全新對(duì)象,后者通常用于保存程序組件的松耦合度。
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
python實(shí)現(xiàn)測(cè)試工具(一)——命令行發(fā)送get請(qǐng)求
這篇文章主要介紹了python如何實(shí)現(xiàn)命令行發(fā)送get請(qǐng)求,幫助大家更好的利用python進(jìn)行測(cè)試工作,感興趣的朋友可以了解下2020-10-10
python計(jì)算階乘的兩個(gè)函數(shù)用法
這篇文章主要介紹了python計(jì)算階乘的兩個(gè)函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
14個(gè)用Python實(shí)現(xiàn)的Excel常用操作總結(jié)
自從學(xué)了Python后就逼迫自己不用Excel,所有操作用Python實(shí)現(xiàn)。目的是鞏固Python,與增強(qiáng)數(shù)據(jù)處理能力。本文為大家總結(jié)了14個(gè)用Python實(shí)現(xiàn)的Excel常用操作,需要的可以參考一下2022-06-06
tensorflow中tf.reduce_mean函數(shù)的使用
這篇文章主要介紹了tensorflow中tf.reduce_mean函數(shù)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python中Turtle庫(kù)改變畫(huà)筆(海龜)方向的兩種方法總結(jié)
turtle庫(kù)是python標(biāo)準(zhǔn)庫(kù)之一,入門(mén)級(jí)繪圖庫(kù),import turtle之后即可使用,下面這篇文章主要給大家介紹了關(guān)于Python中Turtle庫(kù)改變畫(huà)筆(海龜)方向的兩種方法,需要的朋友可以參考下2022-11-11
Python語(yǔ)音合成之第三方庫(kù)gTTs/pyttsx3/speech橫評(píng)(內(nèi)附使用方法)
Python是一種非常強(qiáng)大的腳本語(yǔ)言,可以用來(lái)實(shí)現(xiàn)各種復(fù)雜的應(yīng)用,其中之一就是文本轉(zhuǎn)語(yǔ)音,即把文字轉(zhuǎn)換成聲音來(lái)發(fā)出,下面這篇文章主要給大家介紹了關(guān)于Python語(yǔ)音合成之第三方庫(kù)gTTs/pyttsx3/speech橫評(píng)的相關(guān)資料,文中還介紹了詳細(xì)的使用方法,需要的朋友可以參考下2023-05-05
關(guān)于使用python反編譯apk簽名出包的問(wèn)題
這篇文章主要介紹了使用python反編譯apk簽名出包,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03

