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

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

第一种,修饰器方法

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

可以用来修饰函数

@deco1
def myfunc():
    print("myfunc called.")

myfunc()

或者类

@deco1
class MyClass2:
    def __init__(self):
        self.xx = 0
    def getval(self):
        return self.xx

    def setval(self, val):
        self.xx = val

a = 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):
        pass

my_singleton = My_Singleton()
#这样来使用
from mysingleton import my_singleton
my_singleton.foo()

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

    原文作者:zhaoforyou
    原文地址: https://blog.csdn.net/zhaoforyou/article/details/68957555
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞