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也是单例, 牛逼不
二. 利用装饰器
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)!