Python裝飾器的兩種使用心得
裝飾器的基礎使用(裝飾帶參函數)
def decorator(func): def inner(info): print('inner') func(info) return inner @decorator def show_info(info): print(info) show_info('hello')
防止裝飾器改變裝飾函數名稱
裝飾器在裝飾函數的時候由於返回的是inner的函數地址,所以函數的名稱也會改變 show_info.__name__會變成inner,防止這種現象可以使用functools
import functools def decorator(func): @functools.wraps(func) def inner(info): print('inner') func(info) return inner @decorator def show_info(info): print(info) show_info('hello')
這樣寫就不會改變被裝飾函數的名稱
裝飾器動態註冊函數
此方法在Flask框架的app.Route()的源碼中體現
class Commands(object): def __init__(self): self.cmd = {} def regist_cmd(self, name: str) -> None: def decorator(func): self.cmd[name] = func print('func:',func) return func return decorator commands = Commands() # 使得s1的值指向show_h的函數地址 @commands.regist_cmd('s1') def show_h(): print('show_h') # 使得s2的值指向show_e的函數地址 @commands.regist_cmd('s2') def show_e(): print('show_e') func = commands.cmd['s1'] func()
個人心得
在閱讀裝飾器代碼時可以使用加(func_name)的方式
以為例
@commands.regist_cmd('s2') def show_e(): print('show_e')
即 show_e = commands.regist_cmd(‘s2’)(show_e)
到此這篇關於Python裝飾器的兩種使用的文章就介紹到這瞭,更多相關Python裝飾器使用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!