Python装饰器的两种使用心得

作者:糖烤栗子& 时间:2023-03-17 17:03:23 

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


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)

来源:https://www.cnblogs.com/grocerystore/p/15320144.html

标签:Python,装饰器,使用
0
投稿

猜你喜欢

  • MySQL5.7更改密码时出现ERROR 1054 (42S22)的解决方法

    2024-01-23 12:12:47
  • Python 不同对象比较大小示例探讨

    2023-06-11 01:13:32
  • 浅析python打包工具distutils、setuptools

    2021-03-30 14:45:14
  • 一篇文章弄懂Python中的内建函数

    2023-01-18 00:36:36
  • Python3中map()、reduce()、filter()的用法详解

    2024-01-03 01:27:23
  • Go语言实战学习之流程控制详解

    2024-05-09 14:57:06
  • Pandas计算元素的数量和频率的方法(出现的次数)

    2023-01-02 03:44:58
  • 从两个方面讲解SQL Server口令的脆弱性

    2009-01-08 13:40:00
  • PyTorch搭建LSTM实现多变量时序负荷预测

    2023-10-29 10:48:50
  • 对pytorch网络层结构的数组化详解

    2023-09-02 12:10:09
  • python实现的各种排序算法代码

    2022-06-17 05:41:19
  • python调用外部程序的实操步骤

    2021-09-11 10:39:37
  • python实现复制整个目录的方法

    2023-04-08 18:14:47
  • oracle 更改数据库名的方法

    2009-10-24 18:20:00
  • 详解Pytorch如何利用yaml定义卷积网络

    2023-02-16 10:46:01
  • css+JavaScript实现PDF、ZIP、DOC链接的标注

    2007-05-11 17:03:00
  • 使用Django实现商城验证码模块的方法

    2023-11-04 04:46:23
  • 关于python简单的爬虫操作(requests和etree)

    2022-01-08 02:17:27
  • Python打印不合法的文件名

    2021-06-29 03:40:19
  • Pycharm远程连接服务器并运行与调试

    2021-05-29 04:38:51
  • asp之家 网络编程 m.aspxhome.com