python-单例模式(四种实现方式)
一丶使用模块
Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,
当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们
只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了
#mysingleton.py
class Mysingleton(object):
def foo(self):
pass
my_singleton = Mysingleton()
'''
from mysingleton import Mysingleton
my_singleton.foo()
二丶使用__new__方法
class Mysingleton2(object):
_instance = None
def __new__(cls,*args,**kwargs):
if not _instance:
cls._instance = super(Mysingleton2,cls).__new__(cls,*args,**kwargs)
return cls._instance
class myclass1(Mysingleton2):
a = 1
在上面的代码中,我们将类的实例和一个类变量 _instance 关联起来,如果 cls._instance
为 None 则创建实例,否则直接返回 cls._instance。
三丶使用装饰器
def decorator(cls,*args,**kwargs):
_instance = {}
def _decorator():
if cls not in _instance:
_instance[cls] = cls(*args,**kwargs)
return _instance[cls]
return _decorator
@decorator
class myclass2(object):
a = 1
在上面,我们定义了一个装饰器 decorator,它返回了一个内部函数 _decorator,该函数会
判断某个类是否在字典 _instance 中,如果不存在,则会将 cls 作为 key,cls(*args, **kw)
作为 value 存到 _instance 中,否则,直接返回 _instance[cls]。
四丶 使用 metaclass
元类(metaclass)可以控制类的创建过程,它主要做三件事:
拦截类的创建
修改类的定义
返回修改后的类
使用元类实现单例模式的代码如下:
class single(type):
def __init__(cls,name,bases,adict):
super(single,cls).__init__(name,bases,adict)
cls._instance = None
def __call__(cls,*args,**kwargs):
if not cls._instance:
cls._instance = super(single,cls).__call__(*args,**kwargs)
return cls._instance
class myclass3(metaclass=singletons):
a = 1
一丶使用模块
Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,
当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们
只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了
#mysingleton.py
class Mysingleton(object):
def foo(self):
pass
my_singleton = Mysingleton()
'''
from mysingleton import Mysingleton
my_singleton.foo()
二丶使用__new__方法
class Mysingleton2(object):
_instance = None
def __new__(cls,*args,**kwargs):
if not _instance:
cls._instance = super(Mysingleton2,cls).__new__(cls,*args,**kwargs)
return cls._instance
class myclass1(Mysingleton2):
a = 1
在上面的代码中,我们将类的实例和一个类变量 _instance 关联起来,如果 cls._instance
为 None 则创建实例,否则直接返回 cls._instance。
三丶使用装饰器
def decorator(cls,*args,**kwargs):
_instance = {}
def _decorator():
if cls not in _instance:
_instance[cls] = cls(*args,**kwargs)
return _instance[cls]
return _decorator
@decorator
class myclass2(object):
a = 1
在上面,我们定义了一个装饰器 decorator,它返回了一个内部函数 _decorator,该函数会
判断某个类是否在字典 _instance 中,如果不存在,则会将 cls 作为 key,cls(*args, **kw)
作为 value 存到 _instance 中,否则,直接返回 _instance[cls]。
四丶 使用 metaclass
元类(metaclass)可以控制类的创建过程,它主要做三件事:
拦截类的创建
修改类的定义
返回修改后的类
使用元类实现单例模式的代码如下:
class single(type):
def __init__(cls,name,bases,adict):
super(single,cls).__init__(name,bases,adict)
cls._instance = None
def __call__(cls,*args,**kwargs):
if not cls._instance:
cls._instance = super(single,cls).__call__(*args,**kwargs)
return cls._instance
class myclass3(metaclass=singletons):
a = 1