设计模式:
单例模式:
全局对象唯一
__new__()
作用: 分配内存空间
__init__()
作用: 初始化
初始化唯一性
演示多例的弊端
class Data():
def __init__(self):
# self.data = list()
print("init方法")
self.students = []
def saveData(stu):
data = Data()
data.students.append(stu)
def showData():
data = Data()
print("qqq")
for stu in data.students:
print(stu)
# 我们发现,zs、ls、ww都没有存储到students这个列表中去
saveData('zs')
saveData('ls')
saveData('ww')
showData()
data1 = Data()
data2 = Data()
data3 = Data()
#id(对象) 打印内存中的地址(我们发现每次的地址都不一样)
print(id(data1))
print(id(data2))
print(id(data3))
# 39313592
# 39313704
# 39313816
图解多例设计模式的弊端

单例设计模式解决上面问题
class Data():
#定义一个私有的类属性
__single = None
def __new__(cls, *args, **kwargs):
if cls.__single == None:
print("new方法")
cls.__single = super().__new__(cls)
return cls.__single
def __init__(self):
# self.data = list()
print("init方法")
self.students = []
# def saveData(stu):
# data = Data()
# data.students.append(stu)
# def showData():
# data = Data()
# print("qqq")
# for stu in data.students:
# print(stu)
data1 = Data()
data2 = Data()
data3 = Data()
#id(对象)
print(id(data1))
print(id(data2))
print(id(data3))
图解使用单例后问题没有得到解决的原因(__init__方法每次实例化后都被调用,造成操作的students不同,虽然对象是同一片内存了)

最终解决方法就是让__init__只被调用一次
class Data():
#定义一个私有的类属性
__single = None
__firstInit = False
def __new__(cls, *args, **kwargs):
if cls.__single == None:
print("new方法")
cls.__single = super().__new__(cls)
return cls.__single
def __init__(self):
if Data.__firstInit == False:
# self.data = list()
print("init方法")
self.students = []
Data.__firstInit = True
def saveData(stu):
#创建一个对象(对象的唯一性能够保证该对象多次创建都是同一个对象)
data = Data()
data.students.append(stu)
def showData():
#创建一个对象
data = Data()
print("qqq")
for stu in data.students:
print(stu)
saveData('学生1')
saveData('学生2')
saveData('学生3')
showData()
over......
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有