二十二.面向对象 单例模式

一. 单例模式

单例模式:基于某种方法实例化多次得到实例是同一个
当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例
减少内存占用

类内部定义静态方法实现单例模式

class Da(object):
    def __init__(self,age,name):
        self.age=age
        self.name=name
    def aa(self):
        print("单例模式哈哈哈哈")
v=None
while True:
    if v:
        v.aa()
    else:
        v = Da("555", "张三")
        v.aa()
class People():
    __instance = None
    @classmethod
    def from_conf(cls):
        if cls.__instance:
               return  cls.__instance
        else:
            cls.__instance=People()
            return  cls.__instance
a1=People.from_conf()
print(a1)

a1=People.from_conf()
print(a1)
a1=People.from_conf()
print(a1)

print("*****************************************************************88")

class People():
    __instance = None
    @classmethod
    def from_conf(cls):
        if cls.__instance:
            return cls.__instance

        cls.__instance = cls()
        return cls.__instance

aa=People.from_conf()
print(aa)

a2=People.from_conf()
print(a2)

装饰器实现单例模式

#
# 代码分析:第1行,创建外层函数singleton,可以传入类
#      第2行,创建一个instances字典用来保存单例
#      第3行,创建一个内层函数来获得单例
#      第4,5,6行, 判断instances字典中是否含有单例,如果没有就创建单例并保存到instances字典中,然后返回该单例
#      第7行, 返回内层函数get_instance


# 使用装饰器实现单例模式
# 可以看出,虽然进行了两次实例化,但是仍然为同一个实例。
def singleton(cls, *args, **kwargs):
instance = {}
def _instance():
if cls not in instance:
instance[cls] = cls(*args, *kwargs)
return instance[cls]
return _instance
@singleton
class Test_singleton:
def __init__(self):
self.num = 0
def add(self):
self.num = 99
ts1 = Test_singleton()
ts2 = Test_singleton()
ts3 = Test_singleton()
print(ts1)
print(ts2)
print(ts3)
print(ts3 is ts1)
print(id(ts1))
print(id(ts2))

# <__main__.Test_singleton object at 0x0000017C71418F60>
# <__main__.Test_singleton object at 0x0000017C71418F60>
# <__main__.Test_singleton object at 0x0000017C71418F60>
# True
# 1412705718112
# 1412705718112


print("***********************************************************************888")


# 没有实现单例模式 实例化一下就产生有一个内存空间
class Test:
def __init__(self):
self.num = 0
def add(self):
self.num = 99

ts1=Test()
ts2=Test()
ts3=Test()
print(ts1)
print(ts2)
print(ts3)
print(ts3 is ts1)


# <__main__.Test object at 0x0000017C71422048>
# <__main__.Test object at 0x0000017C71422080>
# <__main__.Test object at 0x0000017C714220B8>
# False
 
#
# 代码分析:第1行,创建外层函数singleton,可以传入类
#      第2行,创建一个instances字典用来保存单例
#        第3行,创建一个内层函数来获得单例
#        第4,5,6行, 判断instances字典中是否含有单例,如果没有就创建单例并保存到instances字典中,然后返回该单例
#        第7行, 返回内层函数get_instance


 # 使用装饰器实现单例模式
# 可以看出,虽然进行了两次实例化,但是仍然为同一个实例。
def singleton(cls,*args,**kwargs):
    instance = {}
    def _instance(*args, **kwargs):
        if cls not in instance:
            instance[cls] = cls(*args, *kwargs)
        return instance[cls]
    return _instance
@singleton
class Test:
    def __init__(self,aa,name):
        self.aa=aa
        self.name=name
ts1 = Test(666,"李四")
ts2 = Test(333,"王五")
print(ts1)
print(ts2)
print(ts1 is  ts2)
print(id(ts1))
print(id(ts2))
# <__main__.Test object at 0x000001FED67C88D0>
# <__main__.Test object at 0x000001FED67C88D0>
# True
# 2194031806672
# 2194031806672
print(ts1.aa)
print(ts2.aa)

print(ts1.name)
print(ts2.name)
#
# 666
# 666
# 李四
# 李四

猜你喜欢

转载自www.cnblogs.com/Sup-to/p/11094767.html