小白自学,装饰器相关问题。求解答

理想主义007 发布于 2018/10/13 16:30
阅读 74
收藏 0

import time
def f1(b):
    print(b)
 
    def func(f):
        def xm(*args, **kwargs):
            print('我先执行了')
            result = f(*args, **kwargs)
            time1 = time.asctime()
            print(time1)
            return result
        return xm
    return func
@f1('1')
def hello(a):
    print('是你先执行的吗?')
    return a
 
print(hello(1))

执行结果是

1
我先执行了
是你先执行的吗?
Wed Aug 22 23:31:33 2018
1

我的问题:第一个1是装饰器函数先执行,然后进入到func()中,打印了我先执行,但是为什么不是继续往下执行打印时间呢?而是去执行了hello函数?还有最后一个1,函数中是return a,并不是打印,为什么还会打印1呢?求解,谢谢大佬们

加载中
0
tcxu
tcxu

Python 语法中的装饰器

The decorator in Python syntax 

关键词:  闭包 closure, 内嵌函数 nested function,  装饰器 decorator, 句法 syntax, 语法糖 Syntactic sugar

图 1. 用语法糖 @ 给 函数 hello(a) 穿上 新衣 f1(1)

这个案例是:使用语法糖 @ 来表示装饰器,它是一个内嵌包装函数,且带参数。
我的理解是:

  1. 最后一行代码 调用的 函数 hello(1),是经带参数的装饰器 f1(1) "打扮"过的。
  2. 在化妆过程之中,函数 f1 的内嵌函数 func(f) 的参数 f, 代表/对应 调用函数 hello(1)。
  3. 在内嵌函数 xm(*args, **kwargs) 的代码块中 在获取时间之前必须帅先调用被装扮的函数 f, 即 hello(1),以便使 result 获值 。
  4. 在 调用函数 f (即,hello(1))的操作过程中,首先执行 print('是你先执行的吗?'),然后再返回 1 (给 result 赋值)。
  5. 调用 f (即,hello(1)) 结束之后, 才能获取 和 打印 时间。
  6. 故,调用  f (即,hello(1)) , 打印/输出 “是你先执行的吗?”在前,打印时间在后。
  7. result 获得的值, 是调用 hello(1)之后返回的 1。
  8. 调用 xm(*args, **kwargs) 的结果,返回 result 的值 1。
  9. 所以, 最终(最后一行),调用 被装饰的 函数 hello(1), 返回值是 1,这个值被最后打印出。
  10. 为了证明: f1(b) 内嵌的函数 func(f) 的参数 f, 代表的是 hello(a), 特在  fun(f) 的定义中插入两行代码,以便打印出两次调用 函数 f (hello(a)), 所返回的字符串参数 a。从而证明 f 代表的就是 hello(a) :
import time
def f1(b):
    print(b)
    def func(f):
        print(f("小白的理想主义的根基是知识和想象。"))
        print(f("XiaoBai's idealism is beased on knowledge and imagination."))
        def xm(*args, **kwargs):
            print('我先执行了')
            result = f(*args, **kwargs)
            time1 = time.asctime()
            print(time1)
            return result
        return xm
    return func
@f1('1')
def hello(a):
    print('是你先执行的吗?')
    return a
print(hello(1))

输出:

D:\untitled\venv\Scripts\python.exe D:/pythonProject0/dec0.py
1
是你先执行的吗?
小白的理想主义的根基是知识和想象。
是你先执行的吗?
XiaoBai's idealism is beased on knowledge and imagination.
我先执行了
是你先执行的吗?
Sun Oct 14 16:10:20 2018
1

 

返回顶部
顶部