下面的几种方法不是我原创的。看大神的帖子,自己敲出来验证下,写出来作为学习笔记记录下
第一种,修饰器方法
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()
还有几种目前没搞太清楚。后面搞清楚了再补充。