Python——装饰器
在不改变调用方式,不改变原有函数内部代码的基础上,为多个函数在执行之前或之后做相同的操作。
前提:必须理解闭包,和闭包的格式以后,才能更好的理解装饰器。
基础装饰器
#===============基本构造==============
def 外层函数(参数):
def 内层函数( * args, * * kwargs):
retrun 参数( * args, * * kwargs)
return 内层函数
#===============实例==================
def a(func):
def b( * args, * * kwargs):
return func( * args, * * kwargs)
return b
@a
def func():
pass
func()
@的作用:
1. 执行a函数,并将func函数当做参数传递到a中。
2. a的返回值重新赋值给下面的函数。
@a
相当于:
func = a(func)
func()
带参数的装饰器
#==================基础版本===================
def wrapper(func):
def innre( * args, * * kwargs):
value = func( * args, * * kwargs)
return value
return innre
@wrapper
def a():
print ( 123 )
a()
#==================带参数的装饰器===================
def wrapper(value):
print (value)
def inner(func):
print ( '678' )
def function( * args, * * kwargs):
f = func( * args, * * kwargs)
return f
return function
return inner
@wrapper ( '456' )
def a():
print ( '123' )
就是在原有的装饰器上再加一层函数,目的是可以传该函数单独使用的参数而设计。
在没有执行a()的时候,带参数的装饰器也会运行到function函数。
在Django中使用装饰器
#在FBV上正常加入即可。下面是在CBV上加入装饰器
from django.utils.decorators import method_decorator
#使用method_decorator和直接使用timer的区别在于装饰器内传入参数的第一位是request对象,而timer的第一位是函数对象
#1. 加到方法上,针对自己写的请求方式
@method_decorator(timer) #timer是写好的装饰器
def get(self,request,*args,**kwargs):
pass
#2. 加到dispatch方法上,该方法是将post、get等所有请求全部涵盖在内。
@method_decorator(timer)
def dispatch(self,request,*args,**kwargs): #dispatch函数是内置的,需要更改就将其单独写在自己的函数中。
print(111)
ret = super().dispatch(request,*range,**kwargs)
print(222)
return ret
#3. 加到类上,可以将name换成单独的请求方式,get或post,如果想全部应用就写dispatch上即可。
@method_decorator(timer,name='dispatch')
class A(View):
pass
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)