python单例模式的几种写法


一、装饰器模式

def singleton(cls, *args, **kwargs):
    instance = {}
    def _singleton():
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    return _sigleton

@singleton
class Test(object):
    a = 1
    
test = Test()
test1 = Test()
print(id(test) == id(test1))
            
>>> True

二、使用new方法

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kargs)
        return cls._instance
        
class Test(Singleton):
    a = 1
    
test = Test()
test1 = Test()
print(id(test) == id(test1))
>>> True

三、共享dict方法

class Singleton(object):
    _state = {}
    def __new__(cls, *args, **kwargs):
        obj = super(Singleton, cls).__new__(cls, *args, **kwargs)
        obj.__dict__ = obj._state
        return obj
        
class Test(Singleton):
    a = 1
    
test = Test()
test1 = Test()
print(id(test) == id(test1))
print(id(test.__dict__) == id(test1.__dict__))
>>> False
>>> True

四、import导入

# a.py
class Test(object):
    a = 1
test = Test()

# b.py
from a import test
print(id(test))

# c.py
from a import test
print(id(test))

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,627评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,975评论 18 399
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 9,673评论 4 16
  • 一早,银行发来工资信息,瞬间就被这不到2000元月工资彻底唤醒,睡意全无。 从外部市场回来,第一个月和外部市场彻底...
    微笑随愿阅读 2,812评论 0 3
  • 这是一篇几天前就想完成的日记,奈何事事推脱,到今天才把文章摆上桌面。 准备到丽江旅游,出发前想找一些旅游攻略想起之...
    野有蔓兮阅读 1,358评论 0 1