日期:2020年2月15日
作者:Commas
註釋:學習就是爲了忘記,接上一章《Python3之面向對象小結》,現在講一下單例;
如果您想了解更多有關Python的知識,那麼請點《我的Python淺談系列目錄》
一、聊一聊單例是什麼
單例
,從字面上理解,一個唯一的實例。在某些情況,我們或許不需要更多的實例,比如視頻播放器,那麼就需要使用單例設計模式
來只允許獲得唯一的一個實例對象。
那麼如何實現呢?實際上很簡單,就是無論多少次類實例化對象的時候,都只返回一個相同的內存地址,保證實例對象的內存地址是相同的,從而保證只有一個實例對象,實現的大致思路如下:
- 首次實例對象,使用Object基類中的__new__()內置靜態方法,爲對象分配內存地址,以後都不再爲實例重新分配內存空間;
- 實例對象屬性只需要初始化一次,所以在內置方法__init__()中做相應的判斷;
二、舉一舉單例的示例
class MoviePlayer:
"""Python3類都會自動繼承Obiect類"""
# 定義類屬性記錄單例對象引用
# 若不爲None,則已經創建了一個實例,
# 將不再爲對象重新申請分配內存空間,實現單例(唯一的一個實例)
instance = None
# 用來記錄實例初始化情況
is_init = False
def __new__(cls, *args, **kwargs):
"""
【object內置靜態方法】:調用時,需要主動傳遞cls參數
1、爲對象分配內存空間
2、返回對象引用
"""
print("調用__new__方法")
if cls.instance is None:
cls.instance = super().__new__(cls)
print(cls.instance)
return cls.instance
def __init__(self):
"""
1、實例對象初始化
2、定義實例屬性
"""
# 因爲單例,所以實例對象只需要被初始化一次
# 我們只要判斷是否有實例是否已創建
if MoviePlayer.is_init:
return
# 標記已經初始化
MoviePlayer.is_init = True
print("調用__init__方法,進行對象實例初始化")
player = MoviePlayer()
print(player)
print("="*20)
player1 = MoviePlayer()
print(player1)
控制檯輸出:
調用__new__方法
<__main__.MoviePlayer object at 0x0000023C59041518>
調用__init__方法,進行對象實例初始化
<__main__.MoviePlayer object at 0x0000023C59041518>
====================
調用__new__方法
<__main__.MoviePlayer object at 0x0000023C59041518>
<__main__.MoviePlayer object at 0x0000023C59041518>
版權聲明:本文爲博主原創文章,如需轉載,請給出:
原文鏈接:https://blog.csdn.net/qq_35844043/article/details/104328551