python装饰器实现单例模式

判断两个类实例是否是同一个,可以根据实例的id值否为相同判断。创建一个简单的类:

class Person(object):
    def __init__(self,name):
        self.name = name

创建两个实例,类名和参数列表都相同,然后查看其id值是否相同:

p1 = Person('jack')
p2 = Person('jack')
print(id(p1)==id(p2))

结果为False,说明不是单例模式(当然不是)。编写一个singleton装饰器,实现单例:

def singleton(cls):
    #实例字典
    instance_dict = {}
    @wraps(cls)
    def new_cls(*args,**kwargs):
        #获得源类的属性,对类名、参数列表都一样,只创建一个这样的实例
        key = '{}_{}_{}'.format(cls.__name__,args,kwargs)
        print(key,cls(*args,**kwargs))
        print(cls)
        if key not in instance_dict:
            instance_dict[key] = cls(*args, **kwargs)
        return instance_dict[key]
    return new_cls

这里利用了字典元素的特性,一个键只有一个对应的值,如果由类名、类参数列表组成的字符串键在instance_dict字典中不存在,则创建这个键值对,如果键存在,则不进行操作,然后把值(类实例)返回。这样就做到了,如果类名、类参数列表都一样,则只能创建一个实例。在Person类名上加上@singleton,测试代码如下:

p1 = Person('jack')
p2 = Person('jack')
print(id(p1)==id(p2))
结果为True,说明单例实现成功

猜你喜欢

转载自blog.csdn.net/smh2208/article/details/80789981