直接上代碼看效果: # 定義一個最簡單的裝飾器 def user_login_data(f): def wrapper(*args, **kwargs): return f(*args, **kwargs) return wrapper # 用裝飾器裝飾以下兩個函數 @user_login_data def num1(): print("aaa") @user_login_data def num2(): print("bbbb") if __name__ == '__main__': print(num1.__name__) print(num2.__name__) 以上代碼的輸出結果為: wrapper wrapper 由此函數使用裝飾器時,函數的函數名即 __name__已經被裝飾器改變. 一般定義裝飾器的話可以不用考慮這點,但是如果多個函數被兩個裝飾器裝飾時就報錯,因為兩個函數名一樣,第二個函數再去裝飾的話就報錯. 解決方案就是引入 functools.wraps ,以上代碼的解決如下: def user_login_data(f): @functools.wraps(f) def wrapper(*args, **kwargs): return f(*args, **kwargs) return wrapper 增加@functools.wraps(f), 可以保持當前裝飾器去裝飾的函數的 __name__ 的值不變 以上輸出結果就是: num1 num2
轉載: https://www.cnblogs.com/skaarl/p/9406910.html
