python-单例模式

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值