欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python学习--嵌套示例、装饰器

程序员文章站 2024-01-15 19:51:46
...

一 嵌套函数示例

1.def p_deco(func):
2.    def wrapper(name):
3.        return "<p>{0}</p>".format(func(name))
4.    return wrapper
5.
6.def book(name):
7.    return "the name of my book is {0}".format(name)
8.
9.  laoqi = p_deco(book)
10. py_book = laoqi("Python大学实用教程")
11.
12. print(py_book)

代码单步调试执行过程
9—>2—>4—>9—>10—>3—>7—>3—>10—>12
9—>2—>4—>9:函数调用p_deco(),返回wrapper(book)
9—>10–>3:左边=wrapper(book(“Python大学实用教程”)),调用wrapper()
3–>7–>3:返回内层book("“Python大学实用教程”)调用结果
3–>10:返回wrapper()函数调用结果
10–>12:输出打印、输出结果。python学习--嵌套示例、装饰器
二 装饰器

def p_deco(func):
    def wrapper(name):
        return "<p>{0}</p>".format(func(name))
    return wrapper

@p_deco
def book(name):
    return "the name of my book is {0}".format(name)
    
# laoqi = p_deco(book)
# py_book = laoqi("Python大学实用教程")

py_book = book("Python大学实用教程")
print(py_book)

输出结果同一中一样。
@p_deco成为装饰器语法糖。实现p标签包裹的功能。
装饰器工作原理:
假设用 funA() 函数装饰器去装饰 funB() 函数。

#funA 作为装饰器函数
def funA(fn):
    #...
    fn() # 执行传入的fn参数
    #...
    return '...'

@funA
def funB():
    #...

实际上,上面程序完全等价于下面的程序:

def funA(fn):
    #...
    fn() # 执行传入的fn参数
    #...
    return '...'

def funB():
    #...

funB = funA(funB)

通过比对以上 2 段程序不难发现,使用函数装饰器 A() 去装饰另一个函数 B(),其底层执行了如下 2 步操作:
将 B 作为参数传给 A() 函数;
将 A() 函数执行完成的返回值反馈回 B。

相关标签: Python