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!

推薦閱讀: