python中的单例模式的实现方法(主要用的就是这三种):
- 使用模块
- 使用__new__()方法
- 使用装饰器
1、使用模块实现
在python中,模块其实就是一种单例模式,第一次加载模块是会生成一个.pyc文件,当第二次加载时就会自动加载生成的.pyc文件。
# 类和需要单例的方法定义
class Singleton(object):
def func(self):
pass
# 在需要用的地方导入即可
from (类定义位置) import Singleton
2、使用__new__()方法(推荐使用)
new()方法属于类的魔法方法,在实例化之前都会先执行__new__()方法,它的执行次序在__init__()方法之前。因此一般情况之下都会用__new__()方法来实现单例模式。话不多说,上代码:
# 单例模式
class Singleton(object):
content = None
def __new__(cls, *args, **kwargs):
if not cls.content:
cls.content = super().__new__(cls)
return cls.content
a = Singleton()
b = Singleton()
print(id(a),id(b))
# 打印结果:
2147690857584 2147690857584
在上面的代码中,content是类中的一个变量,当content是None是,创建实例,否则直接返回content,这样就实现了单例模式了。
3、装饰器实现
大家都知道装饰器可以装饰和修改函数,这里我们可以定义一个装饰器,来生成一个实例。代码开始:
# 装饰器实现单例模式
from functools import wraps
def Singleton(cls):
content = {}
# wraps是装饰器里面的一种方法,可以在装饰函数中使用和被装饰函数属性一样的变量
@wraps(cls)
def wrapper(*args,**kwargs):
if cls not in content:
content[cls] = cls(*args,**kwargs)
return content[cls]
return wrapper
@Singleton
class A(object):
pass
a = A()
b = A()
print(id(a),id(b))
# 执行结果
2191183561448 2191183561448
装饰器实现单例模式,只需要定义一个字典,判断传进来的类是否在字典中,如果不在就把类当作键,参数当作值存入字典。
如有不足,欢迎评论!谢谢