單例模式下,兩個模塊如何調用另外一個模塊的參數進行同步修改,保持一致!!!

創作不易,各位看官,點個贊收藏、關注必回關、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()

在這裏插入圖片描述

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