快速答案
本答案頁包含 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 道題。