單例模式
- 一個類只能創(chuàng)建出唯一的一個對象
無狀態(tài)對象或對象狀態(tài)是共享的
這樣的對象通持笊可以設計為單例對象
實現方式一:使用元類形成約束
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__
),便于使用啊价认。。自娩。當然實現單例還有很多方法用踩,有機會的話再研究研究吧!