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