单例模式

1,单例模式的实现,基于new方法实现

"""
import threading
class Singleton(object):
    instance = None
    lock = threading.RLock()

    def __new__(cls, *args, **kwargs):
        if cls.instance:
            return cls.instance
        with cls.lock:
            cls.instance = object.__new__(cls)
            return cls.instance

def task():
    obj = Singleton()
    print(obj)

for i in range(10):
    t = threading.Thread(target=task)
    t.start()
"""

2. __new__方法返回的是什么?

'''
新创建的对象,内部没有数据,需要经过init来进行初始化。
'''

3,基于文件实现的方式

"""
配置文件
Django的admin
数据库链接池
写日志
都是基于文件的方式实现了单例模式
"""

4, 其他的单例模式

"""
1. 装饰器类型,
优点:可以将任意的类装饰为单例类,方便
缺点:也是适用于单线程,当然可以通过加锁实现多线程,也是种极推荐的方法
import threading

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

@singleton
class A(object):
    data = None
    
    def hh(self):
        print('ggggggg')
"""

5,log日志文件--单例模式的使用log.py

'''
imoprt logging
class AutoLogger(object):
    def __init__(self,log_path,log_name):
        file_handler = logging.FileHandler(log_path, 'a', encoding='utf-8')
        fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s")
        file_handler.setFormatter(fmt)

        self.logger = logging.Logger(log_name, level=logging.DEBUG)
        self.logger.addHandler(file_handler)

    def log(self,msg):
        self.logger.error(msg)

logger = AutoLogger('log_path',log_name)
'''
"""
创建日志文件时,引入log.py文件,当做一个模块使用,
from log import logger
return logger.log(msg="错误信息")
"""
希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
原文地址:https://www.cnblogs.com/daviddd/p/12633737.html