自学内容网 自学内容网

28. python实现单例的几种方式

一. 利用__new__

class CoreLogger:
    """
    对应一个app model, 注意修改file_extra, 这是子目录名称, 会拼接在基础目录中
    记录python alg核心代码的  日志类
    """
    __instance = None

    def __new__(cls, *args, **kwargs):
        """
        单例意义: 每个Django 模块理论上只需要一个模块日志对象,
        """
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance

    def __init__(self):
        """
        判断是为了保证每一个app model 对象当且仅当拥有一个日志对象
        """
        if hasattr(self, 'logger') is False:
            self.logger = Logger(logger_name="[CORE]", file_extra='core')
c1 = CoreLogger()
c2 = CoreLogger()
print(c1.logger is c2.logger)  输出 True
print(c1.logger is c2.logger)  输出 True

上面代码可以报称CoreLogger()是单例,并且其内部的logger也是单例, 牛逼不

二. 利用装饰器

python装饰器

def singleton(cls):
    instances = {}

    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return get_instance

# 使用装饰器
@singleton
class Test:
    def __init__(self, value):
        self.value = value

    # 使用
if __name__ == "__main__":
    obj1 = Test(10)
    obj2 = Test(20)  # 注意这里传入的值是20,但不会影响obj1的实例

    print(obj1.value)  # 输出: 10
    print(obj1 is obj2)  # 输出: True

原文地址:https://blog.csdn.net/qq_36066039/article/details/140529863

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!