python_study_10-单例模式

前言:一些资源管理器常常设计成单例模式:类,可以用类生出多个变量,可有些场景不需要多个变量,项目比较大。比如配置文件,全局都只要一份配置,可在代码多次用并且不需要多次new对象,一个类只需要一个对象,就需要使用单例了。

一、采用修饰器实现单例模式,修饰器的第一个参数应该是被修饰的类,可以采用字典来存储类实例,类作为key,实例作为值

def singleton(cls, *args, **kwargs):
    _instance = {}
    def get_instance():
        if cls not in _instance:
            _instance[cls] = cls(*args, **kwargs)
        return _instance[cls]
    return get_instance

@singleton
class Singleton():
    pass

sln1 = Singleton()
sln2 = Singleton()
print(id(sln1))
print(id(sln2))

output:
sln1=11076560
sln2=11076560


 二、类模式实现单例的关键在于构造器,__new__里控制类只被实例化一次,可以通过类属性保存类实例,判断类属性是否存在,不存在则实例化对象并赋值

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance

sing1 = Singleton()
sing2 = Singleton()
print(id(sing1))
print(id(sing2))
output: sing1
=18743952 sing2=18743952
原文地址:https://www.cnblogs.com/hz-jelly/p/11013115.html