装饰器其实就是将函数作为一个参数传入另一个函数中,返回可以是函数也可以不是函数。
类似如下:
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)
装饰器公式
一个对象(函数)被装饰器装饰就相当于装饰器调用这个对象(函数),然后原来的对象(函数)相当于一个装饰器类型的对象
函数装饰器
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
# 以上代码等价于 --> 装饰器调用这个函数,然后原来的函数相当于一个Timer实例
# add = Timer(add)
if __name__ == "__main__":
print(add(2, 3))
print(type(add)) # <class '__main__.Timer'>
带参数的函数装饰器
类装饰器
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))
带参数的类装饰器
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
# 等价于
# 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
# 等价于
# MyObject = add_str(MyObject)
if __name__ == "__main__":
o = MyObject(1, 2)