python 装饰器,普通装饰函数修饰类函数




def Dec(func):      #1
    def wrapper():     
        print("hello") #3
        func()         #4
        print("world") #5 
    return wrapper   #2

@Dec
def func():
    print("2019-12-31")  

func()              



'''
hello
2019-12-31
world
'''

执行顺序大致是这样,装饰函数相当于  func=Dec(func)

 

@wraps(func)

要使用这个必须导入functools

这个作用是消除(被装饰后的函数名等属性的改变)副作用

from functools import wraps
def Dec(func):
    @wraps(func)
    def wrapper():
        print("hello")
        func()
        print("world")
    return wrapper

@Dec
def func():
    print("2019-12-31")

print(func.__name__,func.__doc__)


#加上 @wraps(func)   输出为func None
#不加  输出为wrapper None

使用普通装饰函数修饰类函数
 

def func(f):
    def wrapper(Teacher):
        print("------------")
        f(Teacher)
    return wrapper


class Teacher():
    def __init__(self):
        pass
    @func
    def Test(self):
        print("hello")


a=Teacher()
a.Test()

因为调用a.Test()的时候有个隐藏参数self,所以wrapper里面要用个类名来进行接收

 

在用tornado做项目的时候有个需求,在调用每个接口的时候都要检查cookie是否有效(cookie这一套我使用的是jwt),基类是basehandler,如果cookie失效则重新登陆

def Verify(f):
    def wrapper(basehandler):
        try:
            #检查cookie
            cookie=basehandler.request.headers.get("Cookie",None)
            #..................
            else:
                print("###########################")
                err=Errorcode(-1,"重新登陆")
                basehandler.set_status(401)
                basehandler.finish(err)
        except Exception as e:
            err=Errorcode(-1,"重新登陆")
            basehandler.set_status(401)
            basehandler.finish(err)

    return wrapper
   @Verify
    def get(self):
        pass

每个接口都加个装饰即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值