设计模式:
单例模式:
全局对象唯一
__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晓码阁 版权所有