快速答案
本答案页包含 Python 装饰器 的 4 道选择题、4 道填空题和 4 道输出预测题,每题都给出准确答案和简短解释。
答案已完整展示,建议先尝试作答,再用本页核对。第一次练习最好从互动练习页开始。
装饰器接收什么,又返回什么?
答案: 一个函数和一个替代的可调用对象
为什么: 装饰器接收函数,并返回一个通常会包装它的可调用对象。
代码的输出结果是什么?
def deco(f):
def wrapper():
return f() + "!"
return wrapper
@deco
def hi():
return "hi"
print(hi())答案: hi!
为什么: 包装函数在原结果后加了一个感叹号。
@deco 放在 def f 上方,等价于什么?
答案: f = deco(f)
为什么: 装饰器在定义时应用,返回值会替换名字 f。
为什么要使用 functools.wraps?
答案: 保留原函数的元数据
为什么: wraps 会把名字、文档字符串等元数据复制到包装函数上。
补全提供 wraps 的模块。
from ____ import wraps答案: functools
为什么: wraps 位于 functools 模块中。
补全装饰器的返回值。
def deco(f):
def wrapper():
return f()
return ____答案: wrapper
为什么: 装饰器必须返回内部的包装函数。
补全收集位置参数的参数名。
def deco(f):
def wrapper(*args, **kwargs):
return f(*____, **kwargs)
return wrapper答案: args
为什么: 包装函数通过 args 转发所有位置参数。
补全保留元数据的辅助函数。
from functools import ____答案: wraps
为什么: wraps 会保留被装饰函数的身份信息。
屏幕上会显示什么?
def deco(f):
def wrapper():
return f() * 2
return wrapper
@deco
def word():
return "ab"
print(word())答案: abab
为什么: 包装函数把字符串重复两次,ab 变成 abab。
这段代码会输出什么?
def deco(f):
def wrapper():
return f().upper()
return wrapper
@deco
def word():
return "hi"
print(word())答案: HI
为什么: 包装函数把结果转成大写,hi 变成 HI。
运行结果是什么?
def deco(f):
def wrapper():
return "[" + f() + "]"
return wrapper
@deco
def word():
return "ok"
print(word())答案: [ok]
为什么: 包装函数在 ok 两边加上方括号。
这段程序打印出什么?
from functools import wraps
def deco(f):
@wraps(f)
def wrapper():
return f()
return wrapper
@deco
def hello():
return "hi"
print(hello.__name__)答案: hello
为什么: wraps 复制了原函数名,所以输出 hello。
先试一遍题目
打开 Python 装饰器 练习页,用即时反馈回答同样的 12 道题。