網(wǎng)站首頁 編程語言 正文
單例 — 讓 類 創(chuàng)建的對象,在系統(tǒng)中 只有唯一的一個實例;
- 1)、定義一個類屬性,初始值是 None ,用于記錄 單例對象的引用;
- 2)、重寫 new 方法;
- 3)、如果 類屬性 is None,調(diào)用父類方法分配空間,并在類屬性中記錄結(jié)果;
- 4)、返回 類屬性 中記錄的 對象引用;
class MusicPlayer(object):
# 記錄第一個被創(chuàng)建對象的引用
instance = None
def __new__(cls, *args, **kwargs):
# 判斷類屬性是否是空對象
if cls.instance is None:
# 調(diào)用父類的方法,為第一個對象分配空間
cls.instance = super().__new__(cls)
# 返回類屬性保存的對象引用
return cls.instance
# 創(chuàng)建多個對象
play1 = MusicPlayer()
print(play1)
play2 = MusicPlayer()
print(play2)
只執(zhí)行一次初始化工作:在每次使用 類名() 創(chuàng)建對象時,Python 的解釋器都會自動調(diào)用兩個方法:
- 1)、new 分配空間;
- 2)、init 對象初始化;
new 方法改造之后,每次都會得到 第一次被創(chuàng)建對象的引用,但是,初始化方法還會被兩次調(diào)用;
需求:讓 初始化動作 只被 執(zhí)行一次;
解決辦法:
- 1)、定義一個類屬性 _init_flag 標(biāo)記是否 執(zhí)行初始化動作,初始值為 False;
- 2)、在 init 方法中,判斷 _init_flag,如果為 False 就執(zhí)行初始化動作;
- 3)、然后將 _init_flag 設(shè)置為 True;
- 4)、這樣,再次 自動 調(diào)用 init 方法時,初始化動作就不會被再次執(zhí)行;
class MusicPlayer(object):
# 記錄第一個被創(chuàng)建對象的引用
instance = None
# 記錄是否執(zhí)行過初始化動作
init_flag = False
def __new__(cls, *args, **kwargs):
# 判斷類屬性是否是空對象
if cls.instance is None:
# 調(diào)用父類的方法,為第一個對象分配空間
cls.instance = super().__new__(cls)
# 返回類屬性保存的對象引用
return cls.instance
def __init__(self):
# 判斷是否執(zhí)行過初始化動作
if MusicPlayer.init_flag:
return
# 如果沒有執(zhí)行過,在執(zhí)行初始化動作
print("初始化播放器")
# 修改類屬性的標(biāo)記
MusicPlayer.init_flag = True
# 創(chuàng)建多個對象
play1 = MusicPlayer()
print(play1)
play2 = MusicPlayer()
print(play2)
原文鏈接:https://blog.csdn.net/weixin_42291376/article/details/122049809
相關(guān)推薦
- 2022-10-25 一文搞懂Golang中iota的用法和原理_Golang
- 2022-03-22 C語言寫一個散列表_C 語言
- 2022-07-02 webpack分離公共模塊失敗
- 2022-08-10 pandas.DataFrame.from_dict直接從字典構(gòu)建DataFrame的方法_pyth
- 2023-01-15 Android開發(fā)可添加頭尾的RecycleView的實現(xiàn)_Android
- 2022-11-02 Mango?Cache緩存管理庫TinyLFU源碼解析_Golang
- 2022-11-07 .NET?實現(xiàn)啟動時重定向程序運行路徑及?Windows?服務(wù)運行模式部署的方法_實用技巧
- 2023-07-26 webpack配置preload和prefetch預(yù)加載技術(shù)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支