設計模式時前人工作的總計和提煉,通常,被人們廣泛流傳的設計模式都是針對某一特定問題的成熟的解決方案;
單例設計模式的應用場景:
單例–讓類建立的物件,在系統中只有唯一的乙個例項
實現思路
1)定義乙個類屬性,初始值是none,用於記錄單例物件的引用
2)重寫__new__方法
3)如果此類屬性 is none,呼叫父類方法分配空間,並在類屬性中記錄結果;-證明之前還沒有定義物件
4)返回類屬性中記錄的物件引用;
再次建立時,直接把第乙個物件的引用做乙個返回,不再呼叫父類的分配空間的方法。因此,無論建立多少個物件,得到的只是第乙個物件的引用。
執行結果:#python單例設計模式
class musicplayer:
#定義了屬性記錄單例物件引用
instance = none
def __new__(cls, *args, **kwargs):
#1.判斷類屬性是否已經被覆蓋
if cls.instance is none:
#2.呼叫父類的方法,為第乙個物件分配空間
cls.instance = super().__new__(cls)
#3.返回類屬性儲存的物件引用
return cls.instance
#建立多個物件:
player1 = musicplayer()
print(player1)
player2 = musicplayer()
print(player2)
id 一樣 ==>多次呼叫方法得到的結果實際上 還是同乙個物件<__main__.musicplayer object at 0x017807d0>
<__main__.musicplayer object at 0x017807d0>
在每次使用類名()建立物件時,python的直譯器都會自動呼叫兩個方法:
1)__new__分配空間
2)__init__物件初始化
如何讓建立物件時,讓初始化動作只執行一次?
解決方案:
1.定義乙個類屬性標記是否執行過初始化動作,初始值為false
2.在__init__方法中,判斷標誌,如果為false,就執行此動作;
3.然後將其改為true;
4.再次呼叫時,值為true,不再執行。
結果:#python單例設計模式
class musicplayer:
#定義了屬性記錄單例物件引用
instance = none
init_flag = false
def __new__(cls, *args, **kwargs):
#1.判斷類屬性是否已經被覆蓋
if cls.instance is none:
#2.呼叫父類的方法,為第乙個物件分配空間
cls.instance = super().__new__(cls)
#3.返回類屬性儲存的物件引用
return cls.instance
def __init__(self):
#1.判斷是個否執行過初始化動作
if musicplayer.init_flag == false:
musicplayer.init_flag = true
else:
pass
#建立多個物件:
player1 = musicplayer()
print(player1)
player2 = musicplayer()
print(player2)
<__main__.musicplayer object at 0x02e5fcb0>
<__main__.musicplayer object at 0x02e5fcb0>
Python 物件導向 單例
單例設計模式 重寫 new 方法 的 非常固定!如果不返回任何結果,定義類屬性記錄單例物件引用 instance none def new cls,args,kwargs 1.判斷類屬性是否已經被賦值 if cls.instance is none cls.instance super new cl...
物件導向 單例設計模式
單例設計模式 就是保證該類在程式中只能存在乙個物件,所以不能讓別人例項化該類,所以要私有化 private 該類的建構函式,但是你要為別人提供乙個該類的唯一物件,所以你要在該類中定義乙個靜態的方法返回本類物件。設計模式 解決某一問題最行之有效的方法 單例設計模式 解決乙個類在記憶體只存在乙個物件 想...
物件導向 單例設計模式
單例設計模式 就是保證該類在程式中只能存在乙個物件,所以不能讓別人例項化該類,所以要私有化 private 該類的建構函式,但是你要為別人提供乙個該類的唯一物件,所以你要在該類中定義乙個靜態的方法返回本類物件。設計模式 解決某一問題最行之有效的方法 單例設計模式 解決乙個類在記憶體只存在乙個物件 想...