单例模式
1、元类实现
class Singleton(type):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._instance = None
def __call__(self, *args, **kwargs):
if not self._instance:
self._instance = super().__call__(*args, **kwargs)
return self._instance
class Valley(metaclass=Singleton):
...
a = Valley()
b = Valley()
print(id(a), id(b))
2、装饰器实现
def singleton(cls):
_instance = {}
def wrapper(*args, **kwargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kwargs)
return _instance[cls]
return wrapper
@singleton
class Valley():
...
a = Valley()
b = Valley()
print(id(a), id(b))
3、内部实现
class Valley:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().__new__(cls, *args, **kwargs)
return cls._instance
if __name__ == '__main__':
a = Valley()
b = Valley()
print(id(a), id(b))