天天看點

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)
           

運作結果如下:

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

可以看出:初始化方法還是會被多次調用

那麼要怎麼樣才能讓初始化動作隻被執行一次呢??

解決辦法(兩者思路很像):

  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)
           

運作結果如下:

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

可以看出,初始化動作隻執行了一次