博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中的单例模式
阅读量:5150 次
发布时间:2019-06-13

本文共 2999 字,大约阅读时间需要 9 分钟。

      单例模式是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某一个类只能出现一个实例时,单例模式就能派上用场了。

     如某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

在python中,我们可以用多种方法来实现单例模式

1.文件导入

2.基于类

无法支持多线程

import threadingclass Singleton(object):     def __init__(self):        pass    @classmethod     def instance(cls, *args, **kwargs):         if not hasattr(Singleton, "_instance"):             Singleton._instance = Singleton(*args, **kwargs)     return Singleton._instance    obj = Singleton.instance()

支持多线程

import timeimport threadingclass Singleton(object):    _instance_lock = threading.Lock()    def __init__(self):        time.sleep(1)    @classmethod    def instance(cls, *args, **kwargs):        if not hasattr(Singleton, "_instance"):            with Singleton._instance_lock:                if not hasattr(Singleton, "_instance"):                    Singleton._instance = Singleton(*args, **kwargs)        return Singleton._instance# 第一次调用def task(arg):    obj = Singleton.instance()    print(obj)for i in range(10):    t = threading.Thread(target=task,args=[i,])    t.start()# 第二次调用    time.sleep(20)obj = Singleton.instance()

3.使用__new__

无法支持多线程

class Singleton(object):        Singleton._instance = None    def __init__(self):        pass    def __new__(cls, *args, **kwargs):        if not hasattr(Singleton, "_instance"):            Singleton._instance = object.__new__(cls, *args, **kwargs)        return Singleton._instance
View Code

支持多线程

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, *args, **kwargs)        return Singleton._instance
View Code

4.基于metaclass

-------------------------------示例(一)-------------------------------# 创建对象class SingletonType(type):    def __call__(cls, *args, **kwargs):        obj = super(SingletonType,cls).__call__(*args, **kwargs)   #type类帮创建__new__和__init__并返回        return objclass Foo(metaclass=SingletonType):    def __init__(self,name):        self.name = nameobj = Foo("alex")-------------------------------示例(二)-------------------------------import threadingclass SingletonType(type):        _instance_lock = threading.Lock()        def __call__(cls, *args, **kwargs):        if not hasattr(cls, "_instance"):            with SingletonType._instance_lock:                if not hasattr(cls, "_instance"):                    cls._instance = super(SingletonType,cls).__call__(*args, **kwargs)        return cls._instanceclass Foo(metaclass=SingletonType):    def __init__(self,name):        self.name = nameobj1 = Foo('name')obj2 = Foo('name')print(obj1,obj2)

转载于:https://www.cnblogs.com/moning/p/8385947.html

你可能感兴趣的文章
Kettle学习系列之Kettle能做什么?(三)
查看>>
【Mac + GitHub】之在另一台Mac电脑上下载GitHub的SSH链接报错
查看>>
Day03:Selenium,BeautifulSoup4
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
一些php文件函数
查看>>
jQuery 给div绑定单击事件
查看>>
有关快速幂取模
查看>>
Linux运维必备工具
查看>>
字符串的查找删除
查看>>
NOI2018垫底记
查看>>
快速切题 poj 1002 487-3279 按规则处理 模拟 难度:0
查看>>
Codeforces Round #277 (Div. 2)
查看>>
【更新】智能手机批量添加联系人
查看>>
NYOJ-128前缀式计算
查看>>
淡定,啊。数据唯一性
查看>>
深入理解 JavaScript 事件循环(一)— event loop
查看>>
Hive(7)-基本查询语句
查看>>