創作不易,各位看官,點個贊收藏、關注必回關、QAQ、您的點贊是我更新的最大動力!
引入:
在操作單例模式的時候,遇到一個問題。
需求:
-
在淘寶的時候。我們可以在首頁將喜歡的商品添加到購物車,也可以在商家店鋪詳情添加購物車
-
購物車的那個圖標數量會增加,可以理解調用一個參數同步變化
-
單例模式 只創建一個對象 後續創建的對象相同
傳統的創建對象:
class Shopping:
pass
shop1 = Shopping()
shop2 = Shopping()
print(shop1,shop2)
上圖結果輸出,看到地址不一致。
========================================================================================
我們來看單例模式基本的操作:
他們得的到結果一致,如下圖
# 是否是第一次創建對象,如果是首次創建對象,則調用父類`__new__`()方法創建對象並返回
# 如果不是第一創建對象,直接返回第一次創建的對象即可
class Shopping:
instance = None #記錄創建的對象,None說明是第一次創建對象
def __new__(cls, *args, **kwargs):
#第一次調用new方法,創建對象並記錄
#第2-n次調用new方式時,不創建對象,而是直接放回記錄的對象
#判斷是否是第一次創建對象
if cls.instance==None:
cls.instance = object.__new__(cls)
return cls.instance
else: #不是第一次創建對象
return cls.instance
shop1 = Shopping()
shop2 = Shopping()
print(shop1,shop2)
簡化版本:
class Shopping:
instance = None #記錄創建的對象,None說明是第一次創建對象
def __new__(cls, *args, **kwargs):
#第一次調用new方法,創建對象並記錄
#第2-n次調用new方式時,不創建對象,而是直接放回記錄的對象
#判斷是否是第一次創建對象
if cls.instance==None:
cls.instance = object.__new__(cls)
return cls.instance
shop1 = Shopping()
shop2 = Shopping()
print(shop1,shop2)
另外個版本:
class Shopping:
def __new__(cls, *args, **kwargs):
#第一次調用new方法,創建對象並記錄
#第2-n次調用new方式時,不創建對象,而是直接放回記錄的對象
#判斷是否是第一次創建對象,判斷是否有instance屬性
if not hasattr(cls,"instance"):
cls.instance = object.__new__(cls)
return cls.instance
shop1 = Shopping()
shop2 = Shopping()
print(shop1,shop2)
==================================================================================
話不多說,來進行文章開頭需求解決:
demo_單例模式.py:
class Shopping():
instance = None #記錄創建的對象,None說明是第一次創建對象
flag = True
def __new__(cls, *args, **kwargs):
#第一次調用new方法,創建對象並記錄
#第2-n次調用new方式時,不創建對象,而是直接放回記錄的對象
#判斷是否是第一次創建對象
if cls.instance==None:
cls.instance = object.__new__(cls)
return cls.instance
def __init__(self,total_price):
# 構建falg,記錄第一次創建對象,關閉二次初始化
if Shopping.flag:
self.total_price = total_price
Shopping.flag = False
demo_01網站詳情頁.py
import demo_單例模式
def use_shopping_cart():
"""打開購物車"""
print("詳情頁--打開購物車")
cart = demo_單例模式.Shopping(10)
# print(cart)
cart.total_price+=10
print(cart.total_price)
demo_02網站列表頁.py
import demo_單例模式
def use_shopping_cart():
"""打開購物車"""
print("列表頁--打開購物車")
cart = demo_單例模式.Shopping(10)
# print(cart)
print(cart.total_price)
main.py
import demo_01網站詳情頁
import demo_02網站列表頁
while True:
num = input("用戶操作:1.列表頁打開購物車 2.詳情頁打開購物車:")
if num=="1":
demo_02網站列表頁.use_shopping_cart()
elif num=="2":
demo_01網站詳情頁.use_shopping_cart()