博客信息

Python基础之面向对象(单例设计模式的应用)

发布时间:『 2019-06-28 18:42』  博客类别:Python  阅读(686)

单例模式对象的唯一性

设计模式:

    单例模式:

        全局对象唯一

 

    __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


图解多例设计模式的弊端


小李飞刀_Python


单例设计模式解决上面问题

 

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不同,虽然对象是同一片内存了


小李飞刀_Python


最终解决方法就是让__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......


关键字:     Python基础       面向对象  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有