首页 > 编程语言 >python中的单例模式

python中的单例模式

时间:2022-10-25 16:45:13浏览次数:43  
标签:__ Singleton python 模式 instance 实例 单例 new

单例模式

单例模式(singleton pattern)是一种常用的软件设计模式,主要目的是确保代码运行时,某一个类只有一个实例存在。这样可以避免多次实例化同一个类,浪费内存资源。

基于__new__方法实现

我们知道,当实例化对象时,是先执行了类的__new__方法(未定义时默认调用object.new)实例化对象;之后再执行类的__init__方法对此对象初始化,基于此实现方式如下:

import threading
class Singleton(object):
    _instance_lock = threading.Lock()

    def __init__(self):
        pass


    def __new__(cls, *args, **kwargs):
        if not hasattr(Singleton, "_instance"):
            with Singleton._instance_lock:
                if not hasattr(Singleton, "_instance"):
                    Singleton._instance = object.__new__(cls)  
        return Singleton._instance

obj1 = Singleton()
obj2 = Singleton()
print(obj1,obj2)

def task(arg):
    obj = Singleton()
    print(obj)

for i in range(10):
    t = threading.Thread(target=task,args=[i,])
    t.start()

其打印结果如下:

<__main__.Singleton object at 0x000001AA0A7F9D48> <__main__.Singleton object at 0x000001AA0A7F9D48>
<__main__.Singleton object at 0x000001AA0A7F9D48>
<__main__.Singleton object at 0x000001AA0A7F9D48>
<__main__.Singleton object at 0x000001AA0A7F9D48>
<__main__.Singleton object at 0x000001AA0A7F9D48>
<__main__.Singleton object at 0x000001AA0A7F9D48>
<__main__.Singleton object at 0x000001AA0A7F9D48>
<__main__.Singleton object at 0x000001AA0A7F9D48>
<__main__.Singleton object at 0x000001AA0A7F9D48>
<__main__.Singleton object at 0x000001AA0A7F9D48>
<__main__.Singleton object at 0x000001AA0A7F9D48>

可以看到每次打印的都是同一个实例。
采用了此方法后,在实例对象时,可以使用与平时实例化对象一样的方法 obj = Singleton()

标签:__,Singleton,python,模式,instance,实例,单例,new
From: https://www.cnblogs.com/qev211/p/16825379.html

相关文章

  • Python|爬取每日疫情数据并使用matplotlib绘制图像进行分析
    网页分析数据源腾讯疫情实时追踪打开网址,F12进入开发者工具(刷新一下页面),如下,所有数据都可以通过接口获取:国内数据接口:https://api.inews.qq.com/newsqa/v1/query/inn......
  • python进阶之路19 地狱入口购物车!!!!
    地狱之门##项目功能#1.用户注册#2.用户登录#3.添加购物车#4.结算购物车##项目说明#用户数据采用json格式存储到文件目录db下一......
  • python json和pickle
    json和pickle共用方法dumps把任意对象序列化成一个strloads把任意str反序列化成原来数据dump把对象序列化后写入到文件对象中load把文件对象中的内容反序列化jso......
  • python生成器
    在Python中,使用了yield的函数被称为生成器(generator)。在Python中,可以使用生成器来一次返回单个元素,从而可以避免大量占用内存。生成器的send()方法可以往生成器发送一......
  • Python3自动化打包项目发布到pypi
    效果D:\Program\Python310\python.exeD:\data\git\PythonLinuxBasicModule\upload.pyC:\Users\刘某usage:twine[-h][--version][--no-color]{register,check,upl......
  • python集合的相关操作
    set1={"1","2","3","4"}set2={"a","b","c","d,"1","2"}一、intersection()交集 res=set1.intersection(set2)print(res)#简写&res=set1&set2prin......
  • python字典相关操作方法
    字典相关函数一、增dic={}dic["ww"]="一表人才,除了帅气的皮囊之外,一无所有"dic['ywz']="渣男"dic["hxl"]="抠脚老汉"print(dic)#fromkeys()使用一组键......
  • 将python2.7项目转为Python3问题记录
    将一个Python2.7开发的测试工具项目转化为Python3。工具:Python自带的2to3.py将所有.py文件进行转化,生成的python3文件为原文件名,python2文件在后面加.bak 1.代码如:b......
  • python列表操作方法
    列表的相关操作(1)列表的拼接(同元组)(2)列表的重复(同元组)(3)列表的切片(同元组)语法=>列表[::]完整格式:[开始索引:结束索引:间隔值](1)[开始索引:]从开......
  • [转载]python跨文件使用全局变量的实现
    python跨文件使用全局变量的实现更新时间:2022-10-2514:46:38发布时间:602天前朗读Python定义了全局变量的特性,使用global关键字修饰1global key_word......