答案頁 · 12 道題

Python 裝飾器練習答案

本頁彙整 Python 裝飾器 的 12 道練習。先做練習頁,再回到這裡核對準確答案和原因。

快速答案

本答案頁包含 Python 裝飾器 的 4 道選擇題、4 道填空題和 4 道輸出預測題,每題都給出準確答案和簡短解釋。

答案已完整展示,建議先嘗試作答,再用本頁核對。第一次練習最好從互動練習頁開始。

01 · 選擇題

裝飾器接收什麼,又回傳什麼?

  1. 一個類和實例
  2. 一個字串和數字
  3. 一個函式和一個替代的可呼叫物件正確答案
  4. 一個模組和包

答案: 一個函式和一個替代的可呼叫物件

為什麼: 裝飾器接收函式,並回傳一個通常會包裝它的可呼叫物件。

02 · 選擇題

程式碼的輸出結果是什麼?

def deco(f):
    def wrapper():
        return f() + "!"
    return wrapper

@deco
def hi():
    return "hi"
print(hi())
  1. !hi
  2. None
  3. hi!正確答案
  4. hi

答案: hi!

為什麼: 包裝函式在原結果後加了一個感嘆號。

03 · 選擇題

@deco 放在 def f 上方,等價於什麼?

  1. f = deco(f)正確答案
  2. deco = f(deco)
  3. f = f(deco)
  4. 只呼叫 deco(f) 但不賦值

答案: f = deco(f)

為什麼: 裝飾器在定義時應用,回傳值會替換名字 f。

04 · 選擇題

為什麼要使用 functools.wraps?

  1. 保留原函式的元資料正確答案
  2. 把函式轉換成類
  3. 呼叫函式兩次
  4. 讓包裝函式執行得更快

答案: 保留原函式的元資料

為什麼: wraps 會把名字、文件字串等元資料複製到包裝函式上。

05 · 填空題

補全提供 wraps 的模組。

from ____ import wraps

答案: functools

為什麼: wraps 位於 functools 模組中。

06 · 填空題

補全裝飾器的回傳值。

def deco(f):
    def wrapper():
        return f()
    return ____

答案: wrapper

為什麼: 裝飾器必須回傳內部的包裝函式。

07 · 填空題

補全收集位置參數的參數名。

def deco(f):
    def wrapper(*args, **kwargs):
        return f(*____, **kwargs)
    return wrapper

答案: args

為什麼: 包裝函式通過 args 轉發所有位置參數。

08 · 填空題

補全保留元資料的輔助函式。

from functools import ____

答案: wraps

為什麼: wraps 會保留被裝飾函式的身份資訊。

09 · 輸出預測

螢幕上會顯示什麼?

def deco(f):
    def wrapper():
        return f() * 2
    return wrapper

@deco
def word():
    return "ab"
print(word())

答案: abab

為什麼: 包裝函式把字串重複兩次,ab 變成 abab。

10 · 輸出預測

這段程式碼會輸出什麼?

def deco(f):
    def wrapper():
        return f().upper()
    return wrapper

@deco
def word():
    return "hi"
print(word())

答案: HI

為什麼: 包裝函式把結果轉成大寫,hi 變成 HI。

11 · 輸出預測

執行結果是什麼?

def deco(f):
    def wrapper():
        return "[" + f() + "]"
    return wrapper

@deco
def word():
    return "ok"
print(word())

答案: [ok]

為什麼: 包裝函式在 ok 兩邊加上方括號。

12 · 輸出預測

這段程式列印出什麼?

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 道題。

練習本課