基础Python的四种单例模式实现方式
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
实现单例的几种方式
- 模块导入
- 添加装饰器(类装饰器和函数装饰器)
- 重写new方法
- 继承元类
方式一
# 方式一:
# 编写脚本my_singleton.py
class Singleton:
def __init__(self, name):
self.name = name
def do_something(self):
pass
singleton = Singleton('模块单例')
# 在其他脚本里
# from my_singleton import singleton
方式二
# -------------------函数装饰器---------------------------
def Singleton1(cls):
instance = {}
def _singleton_wrapper(*args, **kargs):
if cls not in instance:
instance[cls] = cls(*args, **kargs)
return instance[cls]
return _singleton_wrapper
# -------------------类装饰器---------------------------
class Singleton2:
def __init__(self, cls):
self.cls = cls
self._instance = None
def __call__(self, *args, **kwargs):
if self._instance:
self._instance = self.cls(*args, **kwargs)
return self._instance
# SingletonTest = Singleton1(SingletonTest) =_singleton_wrapper
# SingletonTest = Singleton2(SingletonTest) = Singleton2实例对象
@Singleton2
class SingletonTest(object):
def __init__(self, name):
print(">>> 初始化 <<<")
self.name = name
s1 = SingletonTest('s1')
s2 = SingletonTest('s2')
print(id(s1), id(s2))
方式三
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(Singleton, "_instance"):
Singleton._init_flag = True
Singleton._instance = super().__new__(cls)
return Singleton._instance
def __init__(self, name):
if not hasattr(Singleton, "_init_flag"):
print(">>> 初始化 <<<")
self.name = name
s1 = Singleton('s1')
s2 = Singleton('s2')
print(id(s1), id(s2))
方式四
class Singleton(type):
def __call__(cls, *args, **kwargs):
if not hasattr(Singleton, "_instance"):
# cls 为 被装饰的类
Singleton._instance = cls.__new__(cls, *args, **kwargs)
return Singleton._instance
class SingletonTest(metaclass=Singleton):
def __init__(self, name):
print(">>> 初始化 <<<")
self.name = name
s1 = SingletonTest('s1')
s2 = SingletonTest('s2')
print(id(s1), id(s2))
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |