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

 

posted @   新兵蛋Z  阅读(295)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示