千家信息网

Python装饰器怎么用

发表于:2025-01-29 作者:千家信息网编辑
千家信息网最后更新 2025年01月29日,这篇文章给大家分享的是有关Python装饰器怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。装饰器的基础使用(装饰带参函数)def decorator(func):
千家信息网最后更新 2025年01月29日Python装饰器怎么用

这篇文章给大家分享的是有关Python装饰器怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

装饰器的基础使用(装饰带参函数)

def decorator(func):    def inner(info):        print('inner')        func(info)    return inner@decoratordef show_info(info):    print(info)show_info('hello')

防止装饰器改变装饰函数名称

装饰器在装饰函数的时候由于返回的是inner的函数地址,所以函数的名称也会改变 show_info.__name__会变成inner,防止这种现象可以使用functools

import functoolsdef decorator(func):        @functools.wraps(func)    def inner(info):        print('inner')        func(info)    return inner@decoratordef 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 decoratorcommands = 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装饰器怎么用"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

0