網站首頁 編程語言 正文
抽象類作用:抽象類就是控制子類的方法的名稱,要求子類必須按照父類的要求的實現指定的方法,且方法名要和父類保持一致
一、問題場景
主要使用場景是這樣的
比如京東上買東西,買完東西后需要支付,京東可以使用支付寶進行支付,也可以通過微信支付,也可以通過京東白條支付,也可以通過apppay
支付,
每種支付需要走內部的流程。
支付的統一入口是京東,但是點擊不同的支付,需要走不同的流程,京東這邊的流程就需要調用不同的函數;
那統一入口這里的調用起來就會比較麻煩
class Ali(object): ? ? def alipay(self): ? ? ? ? pass class Ten(object): ? ? def tenpay(self): ? ? ? ? pass class App(object): ? ? def apppay(self): ? ? ? ? pass
都是一個支付,阿里的支付、騰訊的支付、蘋果的支付方法名都不一樣、
二、使用抽象類思想解決
此時我們就可以引入python
中的抽線類
首先需要引入2個模塊:
from abc import ABCMeta from abc import abstractmethod
實現代碼如下:
1、錯誤寫法?
from abc import ABCMeta from abc import abstractmethod ? # Payclass就是一個抽象類 class Pay(metaclass=ABCMeta): ? ? @abstractmethod ? ? def pay(self): ? ? ? ? # 定義支付的基礎接口 ? ? ? ? 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("這是華為支付")
比如我們沒有按照要求實例化pay這個方法,執行代碼會拋錯
2、改進寫法?
那我們就按照要求修改代碼即可,這次實例化就不會拋錯:
from abc import ABCMeta, abstractmethod class Pay(metaclass=ABCMeta): ? ? @abstractmethod ? ? def pay(self): ? ? ? ? # 定義支付的基礎接口 ? ? ? ? pass class AliPay(Pay): ? ? def pay(self): ? ? ? ? print("這是支付寶支付") class WetPay(Pay): ? ? def pay(self): ? ? ? ? print("這是微信支付") class HuaweiPay(Pay): ? ? def pay(self): ? ? ? ? print("這是華為支付") AliPay().pay()
執行可成功,結果如下:
3、繼續優化
以在定義一個函數,搭配抽線類來實現,這個的第一個參數就是每個支付的實例,另外一個參數就是每個支付需要的參數
def pay(obj,*args,**kwargs): ? ? obj.pay(*args,**kwargs)
詳情如下:
from abc import ABCMeta, abstractmethod class Pay(metaclass=ABCMeta): ? ? @abstractmethod ? ? def pay(self): ? ? ? ? # 定義支付的基礎接口 ? ? ? ? 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)
三、使用抽象類的注意事項
- 1、抽象類不能被實例化
- 2、子類需要嚴格遵守父類的抽象類的規則,而孫類不需要遵守這個規則
- 3、如果想使用抽象類,則該類只需要繼承抽象類即可
原文鏈接:https://blog.csdn.net/hey_man2017/article/details/124382769
相關推薦
- 2022-08-19 python查看自己安裝的所有庫并導出的命令_python
- 2022-07-11 查看 jvm 參數
- 2022-12-21 C++強制轉換與智能指針示例詳解_C 語言
- 2022-08-22 pytorch深度神經網絡入門準備自己的圖片數據_python
- 2022-12-13 Python實現根據Excel生成Model和數據導入腳本_python
- 2022-09-25 TCP協議和UDP協議
- 2022-10-27 Python使用pandas將表格數據進行處理_python
- 2022-05-12 HarmonyOS 單擊 雙擊 長按 滑動事件
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支