装饰器
'''
一、函数装饰器 (装饰器自身无参数)
@outer
'''
import time def outer(func): def inner(*args, **kwargs): pre_time = time.time() func(*args, **kwargs) after_time = time.time() cost_time = after_time - pre_time return cost_time return inner @outer def hello(): time.sleep(0.5) print('hello') # 执行 带了装饰器@outer的hello()函数,其实就是执行 inner()函数 # hello()函数完成在inner()中的执行后,就重新被赋值:hello = inner if __name__ == '__main__': print(hello())
'''
二、函数装饰器: (装饰器自身有参数)
@wrapper(arg)------>arg提供给最内一层inner()使用,实现相关功能
'''
import time
# 因为装饰器自身要往内部传递参数,所以添加一层(要把原来的outer返回给这一层); 内部都一样
def wrapper(arg): def outer(func): def inner(*args, **kwargs): pre_time = time.time() func(*args, **kwargs) after_time = time.time() print('装饰器参数 arg', arg) cost_time = after_time - pre_time return cost_time return inner return outer @wrapper('my_home') # 装饰器运用的时候参数放进去 def hello01(): time.sleep(0.5) print('go go go') if __name__ == '__main__': print(hello01())
第二大类:类装饰器,分装饰器自身是否传入(有大量功能需要封装入装饰器,采取添加方法并放入__call__进行实现)
'''
三、类装饰器: --装饰器自身传入参数 ''' class Dec: def __init__(self, func): # 第一:传入func self.func = func def __call__(self, *args, **kwargs): # 第二: func的参数: *args, **kwargs print(""" 在这里添加其他功能 """) self.func(*args, **kwargs) # 第三:执行func(*args, **kwargs) return self.func # 第四: 返回 func @Dec def hello02(x, y): time.sleep(0.5) print('go go go', x+y)
'''
四、类装饰器:(自身传入参数)
'''
class Dector: def __init__(self, level): self.level = level def __call__(self, func): def wrapper(*args, **kwargs): print(""" 在这里添加其他功能 """, "可以把类的其他方法放入:实现封装") print('类装饰器中需要参数level', self.level) func(*args, **kwargs) return func return wrapper @Dector('好啊') def hello03(x, y): time.sleep(0.5) print('go go go', x+y)

浙公网安备 33010602011771号