只執行一次初始化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)
運行結果如下:
可以看出:初始化方法還是會被多次調用
那麼要怎麼樣才能讓初始化動作只被執行一次呢??
解決辦法(兩者思路很像):
- 定義一個類屬性
init_flag
標記是否執行過初始化動作,初始值爲false - 在
__init__
方法中,判斷init_flag
,如果爲false就執行初始化操作 - 然後將
init_flag
設置爲Ture - 這樣,再次調用
__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)
運行結果如下:
可以看出,初始化動作只執行了一次