单例模式下,两个模块如何调用另外一个模块的参数进行同步修改,保持一致!!!

创作不易,各位看官,点个赞收藏、关注必回关、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()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44238683/article/details/106069011
今日推荐