2026/2/21 6:01:33
网站建设
项目流程
江苏新站优化,石油网页设计与网站建设,陕煤化建设集团铜川分公司网站,网络公司实践报告3000字是什么装饰器 一个函数#xff0c;它接收另一个函数作为参数#xff0c;并返回一个新的函数#xff08;通常通过闭包实现#xff09;
本质是高阶函数 闭包#xff0c;用于在不修改原函数代码的前提下#xff0c;增强函数功能Python 装饰器#xff08;decorator#x…是什么装饰器 一个函数它接收另一个函数作为参数并返回一个新的函数通常通过闭包实现本质是高阶函数 闭包用于在不修改原函数代码的前提下增强函数功能Python 装饰器decorator是一种以函数 / 类作为参数、并返回新函数 / 类的高阶工具(springAop)它可以在不修改被装饰对象源码和调用方式的前提下为其添加额外功能如日志、计时、权限校验等。补充一句通俗理解装饰器就像给函数 / 类 “穿一件外套”外套自带额外功能不改变衣服本身却能让衣服拥有新的特性。Spring的前置后置通知装饰器的语法使用 decorator_name 来应用在函数或方法上。Python 还提供了一些内置的装饰器比如 staticmethod 和 classmethod用于定义静态方法和类方法。能干嘛日志记录: 装饰器可用于记录函数的调用信息、参数和返回值。性能分析: 可以使用装饰器来测量函数的执行时间。权限控制: 装饰器可用于限制对某些函数的访问权限。缓存: 装饰器可用于实现函数结果的缓存以提高性能。函数装饰器完整工作流程绑定传入原函数→ 定义包装封装额外功能→ 替换返回包装函数→ 调用执行包装逻辑 原函数逻辑案例代码 装饰器decorators是 Python 中的一种高级功能它允许你动态地修改函数或类的行为。 装饰器是一种函数它接受一个函数作为参数并返回一个新的函数或修改原来的函数。 本质上是一个接收函数作为输入并返回一个新的包装过后的函数的对象。 # 1 基础使用# my_decorator 是一个装饰器函数它接受say_hello函数作为参数并返回 wrapper 函数。defmy_decorator(original_function):defwrapper():print(在原函数之前执行)original_function()print(在原函数之后执行)returnwrapper# my_decorator注解将 say_hello 替换为 wrappermy_decoratordefsay_hello():print(Hello!)say_hello()print(**10)# 2 带参数的装饰器defmy_decorator_v2(original_function):defwrapper(*args,**kwargs):print(在原函数之前执行)original_function(*args,**kwargs)print(在原函数之后执行)returnwrappermy_decorator_v2defsay_bye(name):print(fHello,{name}!)say_bye(李四)importtime# 步骤1定义装饰器函数接收被装饰的函数作为参数deftimer_decorator(original_function):# 步骤2定义嵌套的包装函数封装额外功能调用原函数defwrapper():# 额外功能记录开始时间start_timetime.time()print(在原函数之前执行)# 调用被装饰的原函数保留其核心功能resultoriginal_function()print(在原函数之后执行)# 额外功能计算并打印耗时end_timetime.time()print(f函数{original_function.__name__}执行耗时{end_time-start_time:.6f}秒)# 返回原函数的执行结果保证被装饰函数的返回值不丢失returnresult# 步骤3返回包装函数而非直接执行保留包装逻辑供后续调用returnwrapper# 步骤4定义被装饰的目标函数核心业务逻辑defmy_business_func():time.sleep(0.5)# 模拟耗时操作print(核心业务逻辑执行完成)return执行成功# 步骤5手动应用装饰器my_business_funcVartimer_decorator(my_business_func)print(my_business_funcVar)# 调用装饰后的函数resultmy_business_funcVar()print(函数返回值,result)deftimer_decorator(original_function):# 包装函数添加 *args 和 **kwargs兼容任意参数defwrapper(*args,**kwargs):start_timetime.time()# 调用原函数时传入参数保证核心逻辑正常执行resultoriginal_function(*args,**kwargs)end_timetime.time()print(f函数{original_function.__name__}执行耗时{end_time-start_time:.6f}秒)returnresultreturnwrappertimer_decoratordefmy_business_func(name,age20):time.sleep(0.5)print(f核心业务逻辑姓名{name}年龄{age})returnf{name}业务执行成功# 带参数调用装饰器正常工作resultmy_business_func(张三,age25)print(函数返回值,result)多层装饰器deflog(func):wraps(func)defwrapper(*args,**kwargs):print(fLog:{func.__name__})returnfunc(*args,**kwargs)returnwrapperdeftimer(func):wraps(func)defwrapper(*args,**kwargs):starttime.time()resultfunc(*args,**kwargs)print(fTimer:{time.time()-start:.4f}s)returnresultreturnwrapperlogtimerdefadd(a,b):returnab add(3,4)# 先执行 log再执行 timer执行顺序装饰器从下往上应用log先于timer被写但实际执行时timer先包裹add然后log包裹timer的返回值