# 单例模式
# 模式一基于@classmethod
class test:
_instance = None
def __init__(self, name=None):
self.name = name
@classmethod
def singlenton(cls):
if not cls._instance:
cls._instance = test(name='hkj')
return cls._instance
obj1 = test().singlenton()
obj2 = test().singlenton()
# 单例模式二基于装饰器
def outer(cls):
_instance = cls('hkj')
def inner(*args, **kwargs):
if args or kwargs:
obj = cls(*args, **kwargs)
return obj
else:
return _instance
return inner
@outer
class test2:
def __init__(self, name):
self.name = name
obj3 = test2()
obj4 = test2()
#基于__call__ 基于元类
class MyMeta(type):
def __new__(cls,name,bases,dic):
print(name,bases,dic)
return super().__new__(cls,name,bases,dic)
def __call__(self, *args, **kwargs):
if not getattr(self, '_instance'):
self._instance = super().__call__(*args, **kwargs)
return self._instance
class test3(metaclass=MyMeta):
_instance = None
def __init__(self, name):
print(222)
self.name = name
#基于模块的导入单例