python实现单例模式

python实现单例模式


单例模式,简单来说,就是一个类只能有一个实例,并且能够自行实例化向整个系统提供。例如文件系统和任务管理器等。

由此可见,单例模式的要点有三个:
1. 一个类只能有一个实例;
2. 它必须自行创建这个实例;
3. 它必须自行向整个系统提供这个实例


在python实现单例模式的方法总结起来有四种及其对应代码如下:

1. 魔术方法

class SingleTon(object):
    """
    使用__new__实现单例模式
    """
    def __new__(self, *args, **kwargs):
        if not hasattr(self, '_instance'):
            # 如果未实例化, 调用父类的__new__方法来实例化
            self._instance = super(SingleTon, self).__new__(self, *args, **kwargs)
        return self._instance

A1 = SingleTon()
A2 = SingleTon()
print(A1 is A2)  #True

2. 装饰器或者类装饰器

def SingleTonByDecorator(cls):
    """
    使用装饰器实现单例模式
    """
    instance = {}
    def wrap(*args, **kwargs):
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    return wrap

@SingleTonByDecorator
class Bar():
    def __init__(self):
        # 只会执行一次
        print("Init in class Bar")

A3 = Bar()
A4 = Bar()
print(A3 is A4) 

# 运行结果
# Init in class Bar
# True
class SingleTonByClassDecorator(object):
    """
    使用类装饰器实现单例模式
    """
    def __init__(self, cls):
        self.cls = cls
        self._instance = None

    def __call__(self, *args, **kwargs):
        if None == self._instance:
            self._instance = self.cls(*args, **kwargs)
        return self._instance

@SingleTonByClassDecorator
class anotherBar(object):
    def __init__(self):
        print("Init in class anotherBar")
        # 只会执行一次

A5 = anotherBar()
A6 = anotherBar()
print(A5 is A6)

# 运行结果
# Init in class anotherBar
# True

3. 元类

class SingleTonByMetaclass(type):
    """
    使用元类实现单例模式
    """
    def __init__(self, *args, **kwargs):
        self._instance = None
        super(SingleTonByMetaclass, self).__init__(*args, **kwargs)

    def __call__(self, *args, **kwargs):
        if self._instance is None:
            self._instance = super(SingleTonByMetaclass, self).__call__(*args, **kwargs)
        return self._instance

class Foo(metaclass = SingleTonByMetaclass): #单例类
    # Foo(object)  py2中要注意,写法稍有不同
    __metaclass__ = SingleTonByMetaclass
    # 代码执行到这里,元类中的__new__和__init__方法其实都已经被执行了,切只会执行一次

A7 = Foo()
A8 = Foo()
print(A7 is A8) # True

4. import:作为python模块是天然的单例模式


以上为单例模式的个人理解以及python实现的几种方法
如有错误,欢迎指正和交流!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值