25.1、介绍:
1、单例即单个实例,指的是同一个类实例化多次的结果指向同一个对象,用于节省内存空间;
2、如果我们从配置文件中读取配置来进行实例化,在配置相同的情况下,就没必要重复产生对象浪费内存了;
25.2、示例:
1、定义一个 settings.py 文件内容如下:
HOST='1.1.1.1'
PORT=3306
2、定义一个类方法实现单例模式:
import settings
class Mysql:
__instance = None
# 定义一个类的实例化数据属性
def __init__(self, host, port):
self.host = host
self.port = port
@classmethod
# 定义一个类方法
def singleton(cls):
if not cls.__instance:
cls.__instance = cls(settings.HOST, settings.PORT)
# 如果实例不存在就创建实例
return cls.__instance
# 如果实例存在就返回存在的实例
obj1 = Mysql('1.1.1.2', 3306)
obj2 = Mysql('1.1.1.2', 3306)
print(obj1 is obj2)
# obj1和obj2不是同一个对象
# False
obj3 = Mysql.singleton()
obj4 = Mysql.singleton()
print(obj3.host, obj3.port, obj4.host, obj4.port)
# 1.1.1.1 3306 1.1.1.1 3306
print(obj3 is obj4)
# obj3和obj4是同一个对象
# True
3、定义一个装饰器实现单例模式:
import settings
#3
def singleton(cls): # cls = Mysql
#4
__instance = cls(settings.HOST, settings.PORT)
#5
def wrapper(*args, **kwargs):
if args or kwargs:
obj = cls(*args, **kwargs)
return obj
return __instance
#6
return wrapper
#2
@singleton # Mysql = singleton(Mysql) = wrapper
class Mysql:
def __init__(self, host, port):
self.host = host
self.port = port
#1
obj1 = Mysql()
obj2 = Mysql()
obj3 = Mysql()
print(obj1 is obj2 is obj3)
# True
obj4 = Mysql('1.1.1.3', 3308)
obj5 = Mysql('1.1.1.3', 3308)
print(obj3 is obj4)
# False