博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python单例模式的五种实现方式
阅读量:4958 次
发布时间:2019-06-12

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

目录

__new__特殊方法实现

class Singleton:    def __new__(cls, *args, **kwargs):        if not hasattr(cls, '_instance'):            cls._instance = super(Singleton, cls).__new__(cls)        return cls._instance    def __init__(self, name):        self.name = names1 = Singleton('first')s2= Singleton('last')print(s1 == s2)>> Trueprint(s1.name)>> last

tips: __new__方法无法避免触发init(),初始的成员变量会进行覆盖

装饰器实现

def singleton(cls):    _instance = {}    def inner(*args, **kwargs):        if cls not in _instance:            _instance[cls] = cls(*args, **kwargs)        return _instance[cls]    return inner@singletonclass Test:    def __init__(self, name):        self.name = namet1 = Test('first')t2 = Test('last')print(t1==t2)>> Trueprint(t2.name)>> first

类装饰器实现

class Singleton:    def __init__(self, cls):        self._cls = cls        self._instance = {}    def __call__(self, *args):        if self._cls not in self._instance:            self._instance[self._cls] = self._cls(*args)        return self._instance[self._cls]@Singletonclass Cls2:    def __init__(self, name):        self.name = namecls1 = Cls2('first')cls2 = Cls2('last')print(id(cls1) == id(cls2))>> Trueprint(cls1.name)>> first

元类实现

class Singleton1(type):    def __init__(self, *args, **kwargs):        self.__instance = None        super(Singleton1, self).__init__(*args, **kwargs)    def __call__(self, *args, **kwargs):        if self.__instance is None:            self.__instance = super(Singleton1, self).__call__(*args, **kwargs)        return self.__instanceclass C(metaclass=Singleton1):    def __init__(self, name):        self.name = namec1 = C('first')c2 = C('last')print(c1 == c2)>> Trueprint(c2.name)>> first

模块实现

Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。

#foo1.pyclass Singleton(object):    def foo(self):        passsingleton = Singleton()#foo.pyfrom foo1 import singleton

部分内容参考自:

转载于:https://www.cnblogs.com/jiaxiaoxin/p/11233869.html

你可能感兴趣的文章
转帖 eclipse Web项目WebContent目录修改
查看>>
设计模式--4、单例模式
查看>>
博客作业06--图
查看>>
MMORPG 游戏服务器端设计
查看>>
unity销毁层级物体及 NGUI 深度理解总结
查看>>
数学知识
查看>>
poj 1145 递归
查看>>
[scu 4423] Necklace
查看>>
JSON对象和字符串之间的相互转换
查看>>
1629 B君的圆锥
查看>>
[转]我国古代求解最大公约数的方法-更相减损术
查看>>
使用Keras编写GAN的入门
查看>>
数组排序 (选择排序、冒泡排序、插入排序、希尔排序)
查看>>
musql 单表查询
查看>>
【Git】标签管理
查看>>
[HNOI2017]大佬
查看>>
『重构--改善既有代码的设计』读书笔记----Hide Delegate
查看>>
1、libgdx简单介绍
查看>>
Swift iOS tableView static cell动态计算高度
查看>>
Windows Phone开发(24):启动器与选择器之发送短信 转:http://blog.csdn.net/tcjiaan/article/details/7404643...
查看>>