用 Python 实现设计模式(1):单例模式

简介

顾名思义,单例(singleton)就是只有一个实例。单例模式的要点是:一个类只能有一个实例,这个实例在第一次调用的时候创建,在程序退出的时候销毁。

实现

我们可以利用 Python 的 __new__ 方法轻松实现单例模式。__new__ 方法在 __init__方法之前调用,并且 __init__ 方法的 self 参数就是 __new__ 方法的返回值,其他参数与 __new__ 方法其余的参数一致。闲话少说,请看代码:

import threading

class Singleton(object):
    lock = threading.Lock()
    # None表示实例还没有创建
    instance = None
    created = False

    def __new__(cls):
        print('__new__被调用')
        if Singleton.instance == None:
            # 加锁是为了线程安全
            with Singleton.lock:
                if Singleton.instance == None:
                    print('即将创建instance')
                    # 这一行很关键
                    Singleton.instance = super().__new__(cls)
        return Singleton.instance
    
    def __init__(self):
        # 确保__init__只执行一次
        if Singleton.created:
            return
        print('__init__被调用')
        Singleton.created = True

obj1 = Singleton()
obj2 = Singleton()
print(obj1 is obj2)

执行后,输出的结果是:

__new__被调用
即将创建instance
__init__被调用
__new__被调用
True

完美!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值