日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Python抽象類(lèi)應(yīng)用詳情_(kāi)python

作者:勿忘--前行 ? 更新時(shí)間: 2022-06-24 編程語(yǔ)言

抽象類(lèi)作用:抽象類(lèi)就是控制子類(lèi)的方法的名稱(chēng),要求子類(lèi)必須按照父類(lèi)的要求的實(shí)現(xiàn)指定的方法,且方法名要和父類(lèi)保持一致

一、問(wèn)題場(chǎng)景

主要使用場(chǎng)景是這樣的

比如京東上買(mǎi)東西,買(mǎi)完?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è)支付,阿里的支付、騰訊的支付、蘋(píng)果的支付方法名都不一樣、

二、使用抽象類(lèi)思想解決

此時(shí)我們就可以引入python中的抽線類(lèi)

首先需要引入2個(gè)模塊:

from abc import ABCMeta
from abc import abstractmethod

實(shí)現(xiàn)代碼如下:

1、錯(cuò)誤寫(xiě)法?

from abc import ABCMeta
from abc import abstractmethod
?
# Payclass就是一個(gè)抽象類(lèi)
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("這是華為支付")

比如我們沒(méi)有按照要求實(shí)例化pay這個(gè)方法,執(zhí)行代碼會(huì)拋錯(cuò)

2、改進(jìn)寫(xiě)法?

那我們就按照要求修改代碼即可,這次實(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)來(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)

三、使用抽象類(lèi)的注意事項(xiàng)

  • 1、抽象類(lèi)不能被實(shí)例化
  • 2、子類(lèi)需要嚴(yán)格遵守父類(lèi)的抽象類(lèi)的規(guī)則,而孫類(lèi)不需要遵守這個(gè)規(guī)則
  • 3、如果想使用抽象類(lèi),則該類(lèi)只需要繼承抽象類(lèi)即可

原文鏈接:https://blog.csdn.net/hey_man2017/article/details/124382769

欄目分類(lèi)
最近更新