单例模式
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="错误信息")
"""
希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华