博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python创建单例模式的三种方式
阅读量:7072 次
发布时间:2019-06-28

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

hot3.png

使用装饰器

装饰器维护一个字典对象instances,缓存了所有单例类,只要单例不存在则创建,已经存在直接返回该实例对象。

def singleton(cls):    instances = {}    def wrapper(*args, **kwargs):        if cls not in instances:            instances[cls] = cls(*args, **kwargs)        return instances[cls]    return wrapper@singletonclass Foo(object):    passfoo1 = Foo()foo2 = Foo()print foo1 is foo2   # True

使用基类

__new__ 是真正创建实例对象的方法,所以重写基类的 __new__ 方法,以此来保证创建对象的时候只生成一个实例

class Singleton(object):    def __new__(cls, *args, **kwargs):        if not hasattr(cls, '_instance'):            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)        return cls._instanceclass Foo(Singleton):    passfoo1 = Foo()foo2 = Foo()print foo1 is foo2  # True

使用元类

元类(参考:  )是用于创建类对象的类,类对象创建实例对象时需要一定会调用 __call__ 方法,因此在调用 __call__ 时候保证始终只创建一个实例即可, type是python中的一个元类。

class Singleton(type):    def __call__(cls, *args, **kwargs):        if not hasattr(cls, '_instance'):            cls._instance = super(Singleton, cls).__call__(*args, **kwargs)        return cls._instanceclass Foo(object):    __metaclass__ = Singletonfoo1 = Foo()foo2 = Foo()print foo1 is foo2  # True

转载于:https://my.oschina.net/mickelfeng/blog/967440

你可能感兴趣的文章
织梦获取频道页下面的子标题
查看>>
又是一个周末
查看>>
2015-1-10
查看>>
linux 安装Tomcat指定JDK
查看>>
15次课(磁盘格式化 、磁盘挂载、手动增加swap空间)
查看>>
zabbix配置邮件告警
查看>>
零长度数组意义
查看>>
iterator-迭代器
查看>>
C4.5分类决策树算法
查看>>
组策略 从入门到精通 (七) 组策略的继承
查看>>
网站开发人员应该知道的62件事
查看>>
mybatis插入数据库时的问题记录
查看>>
Maven项目pom.xml文件报错“web.xml is missing and <failOnMissingWebXml> is set to true”
查看>>
docker入门之简单的容器使用
查看>>
系统架构相关概念辨析(一)
查看>>
关于java加密
查看>>
thinkphp3.2的行为
查看>>
PHP中使用Redis接管文件存储Session详解
查看>>
前后端如何优化网站性能
查看>>
js bind实现
查看>>