鱼C论坛

 找回密码
 立即注册
查看: 1062|回复: 2

[已解决]装饰器的执行顺序

[复制链接]
发表于 2018-5-9 11:15:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def w1(func):
    print("------1-----")
    def inner():
        print("正在验证权限...")
        if True:
            func()
        else:
            print("验证失败!")
    print("------2-------")
    return inner

@w1
def f1():
    print("-----f1-----")

@w1
def f2():
    print("-----f2-----")

f1()
f2()

执行结果:

------1-----
------2-------
------1-----
------2-------
正在验证权限...
-----f1-----
正在验证权限...
-----f2-----

这里我知道是先执行---1----和----2----,但是不明白为什么是连续执行两次----1----和----2-----?
最佳答案
2018-5-9 17:02:38
补充一点,虽然【decorator总是优先于被装饰得函数加载】,但是【对于每个被装饰得函数而言,decorator只加载一次】。

foo()
bar()
print('*='*12)
foo()
bar()

➜  desktop python3 untitled.py
I am wrapper...
I am wrapper...
I am foo...
I am bar...
*=*=*=*=*=*=*=*=*=*=*=*=
I am foo...
I am bar...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-5-9 16:58:58 | 显示全部楼层
因为wrapper总是优先于被装饰得函数加载。

def wrapper(func):
    print('I am wrapper...')
    def inner():
        #('I am inner...')
        func()
    return inner

@wrapper
def foo():
    print('I am foo...')

@wrapper
def bar():
    print('I am bar...')

foo()
bar()

====================

➜  desktop python3 untitled.py
I am wrapper...
I am wrapper...
I am foo...
I am bar...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-9 17:02:38 | 显示全部楼层    本楼为最佳答案   
补充一点,虽然【decorator总是优先于被装饰得函数加载】,但是【对于每个被装饰得函数而言,decorator只加载一次】。

foo()
bar()
print('*='*12)
foo()
bar()

➜  desktop python3 untitled.py
I am wrapper...
I am wrapper...
I am foo...
I am bar...
*=*=*=*=*=*=*=*=*=*=*=*=
I am foo...
I am bar...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-11 11:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表