裝飾器其實(shí)就是將函數(shù)作為一個(gè)參數(shù)傳入另一個(gè)函數(shù)中佃声,返回可以是函數(shù)也可以不是函數(shù)偷霉。
類似如下:
def add(x, y):
return x + y
def add_num(func, x, y):
print(func(x, y))
if __name__ == "__main__":
add_num(add, 2, 3)
裝飾器公式
一個(gè)對(duì)象(函數(shù))被裝飾器裝飾就相當(dāng)于裝飾器調(diào)用這個(gè)對(duì)象(函數(shù))迄委,然后原來的對(duì)象(函數(shù))相當(dāng)于一個(gè)裝飾器類型的對(duì)象
函數(shù)裝飾器
class Timer:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
start = time.time()
ret = self.func(*args, **kwargs)
print(time.time() - start)
return ret
@Timer
def add(x, y):
return x + y
# 以上代碼等價(jià)于 --> 裝飾器調(diào)用這個(gè)函數(shù),然后原來的函數(shù)相當(dāng)于一個(gè)Timer實(shí)例
# add = Timer(add)
if __name__ == "__main__":
print(add(2, 3))
print(type(add)) # <class '__main__.Timer'>
帶參數(shù)的函數(shù)裝飾器
類裝飾器
import time
class Timer:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
start = time.time()
ret = self.func(*args, **kwargs)
print(time.time() - start)
return ret
@Timer
def add(x, y):
return x + y
if __name__ == "__main__":
print(add(2, 3))
帶參數(shù)的類裝飾器
class Timer:
def __init__(self, prefix):
self.prefix = prefix
def __call__(self, func):
def wrapper(*args,**kwargs):
start = time.time()
ret = func(*args, **kwargs)
print(f"{self.prefix}{time.time() - start}")
return ret
return wrapper
@Timer(prefix="curr_time: ")
def add(x, y):
return x + y
# 等價(jià)于
# add = Timer(prefix="curr_time: ")(add)
if __name__ == "__main__":
print(add(2, 3))
類的裝飾器
def add_str(cls):
def __str__(self):
return str(self.__dict__)
cls.__str__ = __str__
return cls
@add_str
class MyObject:
def __init__(self, a, b):
self.a = a
self.b = b
# 等價(jià)于
# MyObject = add_str(MyObject)
if __name__ == "__main__":
o = MyObject(1, 2)