python装饰器@的详细用法个人笔记

python装饰器@的详细用法个人笔记,带参数以及不带参数

不带装饰器的

运行下方的代码

def funa(a):
    print('1')
    a()
    return '233'

def funb():
    print('2')
    return ''

funb=funa(funb)
print(funb)

输出的结果是

C:\Users\Administrator\PycharmProjects\flaskProject\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/flaskProject/test2.py
1
2
233

Process finished with exit code 0

这是一个不带装饰器的代码
首先定义了一个funa的功能函数,再次定义一个funb的功能函数
之后我们使用了funb=funa(funb)对funb进行了重新复制
从顺序上,funa首先被定义,此时funa是一个功能函数,当代码中写入funa()将会运行这个函数
其次funb被定义,此时funa是一个功能函数,当代码中写入funa()将会运行这个函数
最后我们使用了funa(funb)对funb进行了赋值
这里,funb首先是一个功能函数,作为funa的参数导入,按照funa函数内定义的顺序,首先打印了1,接着运行了funb()函数,最后将233作为返回值
所以最后对funb进行赋值时候使用233,赋值完成后,funb从原来一个功能函数变为了新赋值的字符233
所以最后对打印funb的输出结果是233

带装饰器的

运行下方代码

def funa(a):
    print('1')
    a()
    return '233'

@funa
def funb():
    print('2')
    return ''

print(funb)

得到以下结果

C:\Users\Administrator\PycharmProjects\flaskProject\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/flaskProject/test.py
1
2
233

Process finished with exit code 0

可见装饰器@的作用其实相当于不带装饰器的代码中的funb=funa(funb)
使用装饰器后,funb作为参数传给funa()
funa(funb)的返回值又再次赋值给了funb
所以运行了装饰器代码后再次打印funb,输出结果为233

带参数的装饰器

运行下面的代码

def funa(a):
    print(a)
    def funb(b):
        print(b)
        return 'bbb'
    return funb
@funa('/index')
def func():
    print('c')
    return 'ccc'
print(func)

得到结果

C:\Users\Administrator\PycharmProjects\flaskProject\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/flaskProject/test2.py
/index
<function func at 0x000002A9A2748798>
bbb

Process finished with exit code 0

可见对于带参数的装饰器,被装饰的函数func的函数指针是传递给funa函数内部定义的函数funb,作为funb的参数的
并且funa的返回值要求是funb
否则将报错

其实相当于不带装饰器的下段代码

def funa(a):
    print(a)
    def funb(b):
        print(b)
        return 'bbb'
    return funb
def func():
    print('c')
    return 'ccc'
func=funa('/index')(func)
print(func)

得到结果

C:\Users\Administrator\PycharmProjects\flaskProject\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/flaskProject/test.py
/index
<function func at 0x000001FE0ADE81F8>
bbb

Process finished with exit code 0

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值