单例模式
- 一个类只能创建出唯一的一个对象
无状态对象或对象状态是共享的
这样的对象通常可以设计为单例对象
实现方式一:使用元类形成约束
class SingletonMeta(type):
def __init__(cls, *args, **kwargs):
cls.__instance = None
super().__init__(*args, **kwargs)
def __call__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = super().__call__(*args, **kwargs)
return cls.__instance
class President(object,metaclass=SingletonMeta):
def __init__(self, name, year = 4):
self.name = name
self.year = year
实现方式二:魔术方法__new__
class Singleton(object):
def __init__(self, name):
self.name = name
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = super().__new__(cls)
return cls.__instance
实现方式三:装饰器
from functools import wraps
# 装饰类的装饰器 - 被装饰的不是函数而是一个类
# singleton中的instances虽然是一个局部变量
# 但是由于singleton函数返回的wrapper函数中使用了该变量
# 所以它的生命周期会被延长(相当于是局部变量拥有了全局生命周期)
# 这种现象就称之为闭包(closure)
def singleton(cls):
instances = {}
@wraps(cls)
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
@singleton
class A(object):
def __init__(self, name):
self.name = name
以上三种实现装饰器的方法中呢,推荐使用第三种。理由呢?便于理解啊,便于取消单例模式啊(.__wrapped__
),便于使用啊。。。当然实现单例还有很多方法,有机会的话再研究研究吧!