Python抽象類應(yīng)用詳情
抽象類作用:抽象類就是控制子類的方法的名稱,要求子類必須按照父類的要求的實(shí)現(xiàn)指定的方法,且方法名要和父類保持一致
一、問(wèn)題場(chǎng)景
主要使用場(chǎng)景是這樣的
比如京東上買東西,買完?yáng)|西后需要支付,京東可以使用支付寶進(jìn)行支付,也可以通過(guò)微信支付,也可以通過(guò)京東白條支付,也可以通過(guò)apppay支付,
每種支付需要走內(nèi)部的流程。
支付的統(tǒng)一入口是京東,但是點(diǎn)擊不同的支付,需要走不同的流程,京東這邊的流程就需要調(diào)用不同的函數(shù);
那統(tǒng)一入口這里的調(diào)用起來(lái)就會(huì)比較麻煩
class Ali(object): ? ? def alipay(self): ? ? ? ? pass class Ten(object): ? ? def tenpay(self): ? ? ? ? pass class App(object): ? ? def apppay(self): ? ? ? ? pass
都是一個(gè)支付,阿里的支付、騰訊的支付、蘋果的支付方法名都不一樣、
二、使用抽象類思想解決
此時(shí)我們就可以引入python中的抽線類
首先需要引入2個(gè)模塊:
from abc import ABCMeta from abc import abstractmethod
實(shí)現(xiàn)代碼如下:
1、錯(cuò)誤寫法
from abc import ABCMeta
from abc import abstractmethod
?
# Payclass就是一個(gè)抽象類
class Pay(metaclass=ABCMeta):
? ? @abstractmethod
? ? def pay(self):
? ? ? ? # 定義支付的基礎(chǔ)接口
? ? ? ? pass
class AliPay(Pay):
? ? def ali_pay(self):
? ? ? ? print("這是支付寶支付")
class WetPay(Pay):
? ? def wet_pay(self):
? ? ? ? print("這是微信支付")
class HuaweiPay(Pay):
? ? def hua_pay(self):
? ? ? ? print("這是華為支付")比如我們沒有按照要求實(shí)例化pay這個(gè)方法,執(zhí)行代碼會(huì)拋錯(cuò)

2、改進(jìn)寫法
那我們就按照要求修改代碼即可,這次實(shí)例化就不會(huì)拋錯(cuò):
from abc import ABCMeta, abstractmethod
class Pay(metaclass=ABCMeta):
? ? @abstractmethod
? ? def pay(self):
? ? ? ? # 定義支付的基礎(chǔ)接口
? ? ? ? pass
class AliPay(Pay):
? ? def pay(self):
? ? ? ? print("這是支付寶支付")
class WetPay(Pay):
? ? def pay(self):
? ? ? ? print("這是微信支付")
class HuaweiPay(Pay):
? ? def pay(self):
? ? ? ? print("這是華為支付")
AliPay().pay()執(zhí)行可成功,結(jié)果如下:

3、繼續(xù)優(yōu)化
以在定義一個(gè)函數(shù),搭配抽線類來(lái)實(shí)現(xiàn),這個(gè)的第一個(gè)參數(shù)就是每個(gè)支付的實(shí)例,另外一個(gè)參數(shù)就是每個(gè)支付需要的參數(shù)
def pay(obj,*args,**kwargs): ? ? obj.pay(*args,**kwargs)
詳情如下:
from abc import ABCMeta, abstractmethod
class Pay(metaclass=ABCMeta):
? ? @abstractmethod
? ? def pay(self):
? ? ? ? # 定義支付的基礎(chǔ)接口
? ? ? ? pass
class AliPay(Pay):
? ? def pay(self, *args, **kwargs):
? ? ? ? print("這是支付寶支付{0}".format(args[0]))
class WetPay(Pay):
? ? def pay(self, *args, **kwargs):
? ? ? ? print("這是微信支付{0}".format(args[0]))
class HuaweiPay(Pay):
? ? def pay(self, *args, **kwargs):
? ? ? ? print("這是華為支付{0}".format(args[0]))
def pay(obj, *args, **kwargs):
? ? obj.pay(*args, **kwargs)
if __name__ == "__main__":
? ? ali_pay = AliPay()
? ? wet_apy = WetPay()
? ? pay(ali_pay, 100)
? ? pay(wet_apy, 1000)三、使用抽象類的注意事項(xiàng)
- 1、抽象類不能被實(shí)例化
- 2、子類需要嚴(yán)格遵守父類的抽象類的規(guī)則,而孫類不需要遵守這個(gè)規(guī)則
- 3、如果想使用抽象類,則該類只需要繼承抽象類即可
到此這篇關(guān)于Python抽象類應(yīng)用詳情的文章就介紹到這了,更多相關(guān)Python抽象類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)的文本對(duì)比報(bào)告生成工具示例
這篇文章主要介紹了Python實(shí)現(xiàn)的文本對(duì)比報(bào)告生成工具,涉及Python基于difflib模塊實(shí)現(xiàn)對(duì)文本內(nèi)容進(jìn)行對(duì)比的相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
Python中類型關(guān)系和繼承關(guān)系實(shí)例詳解
這篇文章主要介紹了Python中類型關(guān)系和繼承關(guān)系,較為詳細(xì)的分析了Python中類型關(guān)系和繼承關(guān)系的原理與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05
已安裝tensorflow-gpu,但keras無(wú)法使用GPU加速的解決
今天小編就為大家分享一篇已安裝tensorflow-gpu,但keras無(wú)法使用GPU加速的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
Python切換pip源兩種方法(解決pip?install慢)
這篇文章主要給大家介紹了關(guān)于Python切換pip源兩種方法(解決pip?install慢),我總結(jié)的這幾種更換pip源的常用方式,希望可以幫助您成功配置國(guó)內(nèi)源,解決安裝Python包速度慢的問(wèn)題,需要的朋友可以參考下2023-11-11
解決django 向mysql中寫入中文字符出錯(cuò)的問(wèn)題
這篇文章主要介紹了解決django 向mysql中寫入中文字符出錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
2021年的Python 時(shí)間軸和即將推出的功能詳解
這篇文章主要介紹了2021年的Python 時(shí)間軸和即將推出的功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07

