python装饰器返回_python装饰器详解

550797-20200617092143549-1434735130.png

一句话说明:print( get_something(params) ) 实例上调用的是 print( auth(get_something)(params) )

解释:

1)装饰器本身也是一个函数,并且它的返回值也必须是一个函数;

2)处理过程是把原函数当作参数传入装饰器函数,然后向返回的函数传入原函数的参数并执行,最后得到执行结果

Demo1 装饰器啥也不做,直接返回函数本身:

defauth(func):returnfunc

@authdefget_something():return '大宝贝'

print(get_something())

# 大宝贝

注:装饰器返回的函数会被自动执行。

Demo2 装饰器返回了函数,但没处理原函数:

defauth(func):defanonymity():return '无关的东东'

returnanonymity

@authdefget_something():return '大宝贝'

print(get_something())

# 无关的东东

注:返回anonymity函数会自动执行了,返回 "无关的东东";但 func(即 get_something)没有被处理到。

Demo3 装饰器内部函数返回被装饰函数:

defauth(func):defanonymity():returnfuncreturnanonymity

@authdefget_something():return '大宝贝'

print(get_something())#

注:这个demo乍看和Demo1是一样的,但其实是不一样的。auth装饰器返回的是 anonymity 函数会自动被执行,但返回的是 func 函数对象,func并没有被执行 。

Demo4 在auth装饰器里的anonmity函数里直接执行 get_something 但没返回结果:

defauth(func):defanonymity():

func()returnNonereturnanonymity

@authdefget_something():print('你调用了 get_something 函数')return '大宝贝'

print(get_something())#你调用了 get_something 函数#None

注:auth返回anonmity并被自动执行的时候,会调用func函数(也就是get_something函数)输出 ”你调用了 get_something 函数“,但没有接收和处理到 func() 的返回值,所以不会输出“大宝贝”。

Demo5 同上,但返回的不是None,是返回 func 的函数结果:

defauth(func):defanonymity():returnfunc()returnanonymity

@authdefget_something():print('你调用了 get_something 函数')return '大宝贝'

print(get_something())#你调用了 get_something 函数#大宝贝

注: anonymity被执行的时候,执行了 func(),并返回了 func() 的返回值。

Demo6 接收被装饰函数的参数:

defauth(func):def anonymity(token):if token == '123456':returnfunc(token)else:returnNonereturnanonymity

@authdef get_something(token):return '大宝贝'

print(get_something('123456'))print(get_something('456789'))#大宝贝#None

注:anonymity接收了token参数但做了判断,判断是否执行 func 函数(原get_something函数)

Demo 7 接收原函数所有参数:

defauth(func):def anonymity(*args, **kwargs):if 'token' inkwargs:

token= kwargs['token']else:

token=args[0]if token == '123456':return func(*args, **kwargs)else:returnNonereturnanonymity

@authdefget_something(token):return '大宝贝'

print(get_something('123456'))print(get_something(token='456789'))#大宝贝#None

注:关键是 *args 和 **kwargs

Demo8 带参数的装饰器:

def auth(source=''):defwrap(func):def anonymity(*args, **kwargs):

token= kwargs['token'] if 'token' in kwargs elseargs[0]if source == 'app' and token == '123456':return func(*args, **kwargs)elif source == 'm' and token == '456789':return func(*args, **kwargs)else:returnNonereturnanonymityreturnwrap

@auth(source='app')defapp_get_something(token):return '大宝贝'@auth(source='m')defm_get_something(token):return '大宝贝'

print(app_get_something(token='123456'))print(m_get_something(token='456789'))#大宝贝#大宝贝

注:当装饰器增加传入参数时,装饰器要多嵌套一层函数,原函数被当作参数传给装饰器的返回函数,原函数的参数被传入装饰器的返回函数的返回函数

即:auth(source='app')(app_get_something)(token='123456') 、auth(source='m')(m_get_something)(token='456789')

完。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值