python中装饰器语句为何会在编译时就运行?

发布于 2022-09-05 23:16:39 字数 430 浏览 31 评论 0

在学习装饰器时,对装饰器函数在编译时就运行有点没搞懂,我一直以为函数应当在被调用时才会被运行。网上找资料也大部分是说装饰器函数在编译时就运行了。但却没说为啥需要在编译时就运行。因此想知道为何装饰器需要在编译时运行?

def dec(fun):
    print("call dec")
    def in_dec():
        print("call in_dec")
        fun()
    print id(in_dec)
    return in_dec
@dec
def fun():
    print("call fun")


print(type(fun))
print id(fun)
fun()

call dec
4299997384
<type 'function'>
4299997384
call in_dec
call fun

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

说不完的你爱 2022-09-12 23:16:39

这里牵涉到闭包自由变量的概念, 关注下面的a_list变量,如果每次在调用时重新运行那么就起不到这个效果了:

def dec(fun):
    print("call dec")
    a_list = []
    def in_dec(i):
        print("call in_dec")
        a_list.append(i)
        fun()
        print(a_list)
    print id(in_dec)
    return in_dec

@dec
def fun():
    print("call fun")

print ('-' * 30) # 装饰器在编译时运行

fun(1)  # [1]
fun(2)  # [1, 2]    

你再看下下面这种是不是你要的效果:

def dec(fun):
    print("call dec")
    a_list = []
    def in_dec(i):
        print("call in_dec")
        a_list.append(i)
        fun()
        print(a_list)
    print id(in_dec)
    return in_dec


def fun():
    print("call fun")


a = dec(fun)
b = dec(fun)

a(1)  # [1]
b(2)  # [2]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文