python中如何只執行一次初始化init工作

只執行一次初始化init工作:

這篇文章:python中的單例:讓類創建的對象,在系統中只有唯一的一個實例
講到了對__new__進行改造後,每次都會得到第一次被創建對象的引用
但是:初始化方法還是會被多次調用
代碼如下:

class MusicPlayer(object):

    #記錄第一個被創建對象的引用
    instance = None

    def __new__(cls, *args, **kwargs):

        #1.判斷類屬性是否爲空對象,若爲空說明第一個對象還沒被創建
        if cls.instance is None:
        #2.對第一個對象沒有被創建,我們應該調用父類的方法,爲第一個對象分配空間
            cls.instance = super().__new__(cls)
        #3.把類屬性中保存的對象引用返回給python的解釋器
        return cls.instance

    def __init__(self):
        print("初始化init")

#創建多個對象
player1 = MusicPlayer()
print(player1)

player2 = MusicPlayer()
print(player2)

運行結果如下:
在這裏插入圖片描述
可以看出:初始化方法還是會被多次調用

那麼要怎麼樣才能讓初始化動作只被執行一次呢??
解決辦法(兩者思路很像):

  1. 定義一個類屬性init_flag標記是否執行過初始化動作,初始值爲false
  2. __init__方法中,判斷init_flag,如果爲false就執行初始化操作
  3. 然後將init_flag設置爲Ture
  4. 這樣,再次調用__init__方法時,初始化就不會再次被執行了

修改後代碼如下:

class MusicPlayer(object):

    #記錄第一個被創建對象的引用
    instance = None
    #記錄是否執行過初始化動作
    init_flag = False

    def __new__(cls, *args, **kwargs):

        #1.判斷類屬性是否爲空對象,若爲空說明第一個對象還沒被創建
        if cls.instance is None:
        #2.對第一個對象沒有被創建,我們應該調用父類的方法,爲第一個對象分配空間
            cls.instance = super().__new__(cls)
        #3.把類屬性中保存的對象引用返回給python的解釋器
        return cls.instance

    def __init__(self):

        #1.判斷是否執行過初始化動作,若執行過,直覺return
        if MusicPlayer.init_flag:
            return

        #2.若沒執行過,再執行初始化動作
        print("初始化init")

        #修改類屬性的標記
        MusicPlayer.init_flag = True



#創建多個對象
player1 = MusicPlayer()
print(player1)

player2 = MusicPlayer()
print(player2)

運行結果如下:
在這裏插入圖片描述
可以看出,初始化動作只執行了一次

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