裝飾器和單例模式
阿新 • • 發佈:2020-12-20
1,通過裝飾器實現單例模式,只要任意一個類使用該裝飾器裝飾,那麼就會變成一個單例模式的類
解釋:這個類被裝飾器裝飾完之後,這個類變指向了裝飾器的內層函式fun,那麼再通過
t1 = MyTest()並沒有建立物件,而是呼叫了函式t1 = fun(),那麼物件只能在裝飾器內部實現並賦值給t1
def single(cls):
# 不建議用列表,因為不確定返回哪個物件 instance = {}
def fun(*args, **kwargs): if cls in instance: return instance[cls]else:
# 如果類不在字典中,通過cls建立類的例項物件並新增到這個instance字典中(cls是指向這個類的) instance[cls] = cls(*args, **kwargs) return instance[cls] return fun @single # MyTest = single(MyTest) class MyTest: pass @single class Test: pass
t1 = MyTest()
2,通過類實現一個通用的裝飾器,既可以裝飾函式 也可以裝飾類,既可以裝飾有引數的 也可以裝飾無引數的
class Decorator: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print('這個是裝飾器裡面的功能') self.func() @Decorator # test = Decorator(test) 該方法被裝飾完之後就生成了一個物件,那麼物件如何被呼叫呢?通過__call__方法
def test_01(): print('--被裝飾的函式--') test_01()