验证python3实现单例模式的几种方法

来源:互联网 发布:java封装snmp协议 编辑:程序博客网 时间:2024/06/06 11:38

下面的几种方法不是我原创的。看大神的帖子,自己敲出来验证下,写出来作为学习笔记记录下

第一种,修饰器方法

def deco1(func):    """    装饰器方法,    :param func:被修饰函数    :return:返回计算结果    """    list1={}    def _deco1(*args, **kwargs):        if func not in list1:            list1[func] = func(*args, **kwargs)        return list1[func]    return _deco1

可以用来修饰函数

@deco1def myfunc():    print("myfunc called.")myfunc()
或者类
@deco1class MyClass2:    def __init__(self):        self.xx = 0    def getval(self):        return self.xx    def setval(self, val):        self.xx = vala = MyClass2()a.setval(2)b = MyClass2()print("b=",b.getval())

第二种方法,元类方式。

class Singleton1(type):    _inst = {}    def __call__(self, *args, **kw):        if self not in self._inst:            self._inst[self] = super(Singleton1, self).__call__(*args, **kw)        return self._inst[self]
python3中的使用方式
class MyClass1(metaclass = Singleton1):    def __init__(self):        self.xx = 0            def getval(self):        return self.xx    def setval(self, val):        self.xx = val
python2中的使用方式
class MyClass1:__metaclass__ = Singleton1    def __init__(self):        self.xx = 0    def getval(self):        return self.xx    def setval(self, val):        self.xx = val
第三种方法,利用import只导入一次。python模块就是天然的单例模式。
class My_Singleton(object):    def foo(self):        passmy_singleton = My_Singleton()
#这样来使用from mysingleton import my_singletonmy_singleton.foo()

还有几种目前没搞太清楚。后面搞清楚了再补充。



0 0
原创粉丝点击