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:输出打印、输出结果。
二 装饰器
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。