Python3之單例淺談

日期:2020年2月15日
作者:Commas
註釋:學習就是爲了忘記,接上一章《Python3之面向對象小結》,現在講一下單例;
如果您想了解更多有關Python的知識,那麼請點《我的Python淺談系列目錄》



一、聊一聊單例是什麼

單例,從字面上理解,一個唯一的實例。在某些情況,我們或許不需要更多的實例,比如視頻播放器,那麼就需要使用單例設計模式來只允許獲得唯一的一個實例對象。
那麼如何實現呢?實際上很簡單,就是無論多少次類實例化對象的時候,都只返回一個相同的內存地址,保證實例對象的內存地址是相同的,從而保證只有一個實例對象,實現的大致思路如下:

  1. 首次實例對象,使用Object基類中的__new__()內置靜態方法,爲對象分配內存地址,以後都不再爲實例重新分配內存空間;
  2. 實例對象屬性只需要初始化一次,所以在內置方法__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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章