python的单例模式及多线程加锁实现详解

本文详细介绍了Python中单例模式的实现方法,包括基本的代码实现、多线程安全性和利用import模块实现单例。通过示例代码展示了如何确保在多线程环境下正确创建并返回同一对象,以及import导入模块作为实现单例的简洁方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式算是最常见的设计模式了,也是面试中的高频测试点。这一篇就来总结下如何在python中实现单例模式。

单例模式

所谓单例模式,就是针对某一个类,不管实例化多少次,实例出来的对象都是同一个

之所以需要用到单例模式,有两个主要原因。其一是在程序开发中很多对象用于全局的记录,这些对象不管在程序的哪个地方被调用都应该是指向同一个,例如日志对象。其二是因为对象的创建和销毁都是耗费资源的,如果对象的创建次数减少,势必能提高程序的整体运行效率。

对象创建过程

下面先来看看python类对象的创建过程是啥样的。

平时新建一个类通常会带一个__init__()方法,如下

class MyClass:
    def __init__(self):
        pass

这里的__init__()方法的作用是对实例话的对象进行初始化,例如设定一些类变量的初始值。

但是其实在初始化之前还需要先把实例给创建出来啊,没错,这一步编译器已经替我们完成了,如果我们要手动去实现实例对象的创建可以用__new__()方法,如下

class MyClass:
    def __init__(self):
        print('initialize the object')

    def __new__(cls, *args, **kwargs):
        print('create a new object')
        return super().__new__(cls)

在所有类的基类object类中,__new__()方法接受一个类名做为参数,然后返回该类的一个空的实例对象。所以如果我们要自己去实现__new__()方法,必须用super()关键字去调用基类中的__new__()方法,并把自带的cls参数传递进去,从而获得一个本类的实例对象。

这样当类实例化的时候,首先将类通过cls参数传递到__new__()方法中,返回一个对象然后通过self参数传递到__init__()方法中。来测试下

if __name__ == '__main__':
    o = MyClass()

打印结果为

create a new object
initialize the object

值得注意的是__new__()方法只要返回一个对象即可,不一定是本类的一个实例对象,例如

class MyClass:
    def __init__(self):
        print('initialize the object')

    def __new__(cls, *args, **kwargs):
        print('create a new object')
        # return super().__new__(cls)
        return TempClass()


class TempClass:
    def __str__(self):
        return 'This is a temp class'

这里在__new__()方法里面返回的是一个TempClass的对象,再来测试下

if __name__ == 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值