1. 程式人生 > 實用技巧 >裝飾器和單例模式

裝飾器和單例模式

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()