单例模式的概念:
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场
比如,项目中使用的数据库连接池对象和配置对象通常都是单例,这样才能保证所有地方获取到的数据库连接和配置信息是完全一致的;而且由于对象只有唯一的实例,因此从根本上避免了重复创建对象造成的时间和空间上的开销,也避免了对资源的多重占用
装饰器实现单例模式
代码:
# 装饰器实现单例模式
from functools import wraps
def singleton(cls):
"""单例类装饰器"""
instances = {}
# 为装饰器增加__wrapped__属性,用来取消单例模式
@wraps(cls)
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
@singleton
class President:
def __init__(self, name):
print('创建ing')
self.name = name
不了解什么是装饰器的小伙伴可以参考:python 装饰器详解 - 知乎 (zhihu.com)
使用类__new__方法实现单例模式
代码:
# 使用类__new__方法实现单例模式
class Singleton:
__obj = None
__init_flag = True
def __init__(self):
# 创建只初始化一次
if Singleton.__init_flag:
# print(self) # 实例化的对象
print('-----创建中------')
Singleton.__init_flag = False
# print('-----创建中------')
def __new__(cls, *args, **kwargs):
# print(cls) # 类本身
if cls.__obj is None:
cls.__obj = object.__new__(cls)
return cls.__obj
使用元类设计单例模式
代码:
# 使用元类设计单例模式
class SingletonMeta(type):
def __init__(cls, *args, **kwargs):
cls.__instance = None
super().__init__(*args, **kwargs)
def __call__(cls, *args, **kwargs): # 先创建实例对象(__new__方法),在初始化对象(__init__方法)
if cls.__instance is None:
cls.__instance = super().__call__(cls, *args, **kwargs)
return cls.__instance
class PresidentMeta(metaclass=SingletonMeta):
def __init__(self, name):
print('创建ing')
self.name = name
不了解元类的小伙伴可以参考:详解Python元类 - 知乎 (zhihu.com)
ps:记录一下自己的一些学习心得供参考,希望对大家有帮助