python 装饰器详解与应用范例

作者:不侠居 时间:2022-03-18 01:06:55 

什么是装饰器

从字面意思上来看,装饰器是用来装饰其他东西的工具。在python中装饰器分为函数装饰器和类装饰器。
简而言之,函数装饰器是用来装饰函数的装饰器,其主要目的是增加目标函数的功能,类装饰器也就是装饰类的装饰器,增加类的功能。

函数装饰器

装饰器本质是嵌套函数
下面是一个简单的装饰器


# fun1为装饰器名称,function指的是被装饰的函数
def fun1(function):
def fun2():
print("开始了!")
function() # 执行被装饰的函数或者 或者 return function()
return fun2

外面的fun1()需要传入一个参数,这个参数是用来传入要被装饰的函数,里面的fun2()需要执行function这个参数。
这是将函数当成参数传入另一个函数。

使用方法:
在需要装饰的函数上添加@装饰器名称


@fun1
def fun3():
print("aaa")

fun3()

可以等价成这样:


def fun3():
print("aaa")
fun = fun1(fun3)
fun()

输出结果是一致的

执行结果:

开始了!
aaa

如果传入的函数需要参数可以这样写:


def fun1(function):
def fun2(a):
print("开始了!")
function(a)
return fun2

@fun1
def fun3(a):
print(a)
fun3("aaa")

输出结果:

开始了!
aaa

如果不清楚传入的函数需要多少个参数,可以这样写:


def fun1(function):
def fun2(*args, **kwargs):
print("开始了!")
function(*args, **kwargs)
return fun2

@fun1
def fun3(a,b):
print(a,b)

@fun1
def fun4(a,b,c):
   print(a,b,c)

fun3("aaa","bbb")
fun4("ccc","ddd","eee")

运行结果:

开始了!
aaa bbb
开始了!
ccc ddd eee

如果函数装饰器需要添加参数,可以这样写:


def fun(msg):
def fun1(function):
def fun2(*args, **kwargs):
print("开始了!{}".format(msg))
function(*args, **kwargs)
return fun2
return fun1

@fun(msg="小朋友")
def fun3(a,b):
print(a,b)

fun3("aaa","bbb")

运行结果:

开始了!小朋友
aaa bbb

类装饰器

类装饰器的用法基本和函数装饰器一样,只不过是用类写的装饰器


class fun1(object):
   def __init__(self, func):
       self.func = func

def __call__(self, *args, **kwargs):
       print(("开始了!")
       self.func(*args, **kwargs)

@fun1
def fun2(a,b):
print(a,b)

fun2("aaa","bbb")

类装饰用到了类的__call__方法

运行结果:

开始了!
aaa bbb

还可以这样写:


class fun(object):
   def __init__(self, msg):
       self.msg = msg

def __call__(self, func):
       def fun1(*args, **kwargs):
           print("开始了!{0}".format(self.msg))
           func(*args, **kwargs)
       return fun1

@fun(msg="小朋友")
def fun2(a, b):
   print(a, b)

fun2("aaa,","bbb")

运行结果:

开始了!小朋友
aaa, bbb

来源:https://blog.csdn.net/m0_46778548/article/details/121011882

标签:python,装饰器
0
投稿

猜你喜欢

  • python xlsxwriter创建excel图表的方法

    2021-01-12 03:16:10
  • PHP实现的DES加密解密类定义与用法示例

    2023-07-17 08:55:54
  • python3的url编码和解码,自定义gbk、utf-8的例子

    2022-08-02 10:07:39
  • 对python pandas 画移动平均线的方法详解

    2023-11-16 04:21:33
  • 一个ASP站内搜索的实例源代码

    2007-09-21 12:13:00
  • python 下划线的不同用法

    2021-01-20 16:55:13
  • Django中使用haystack+whoosh实现搜索功能

    2021-10-12 23:54:14
  • Mysql的Binlog数据恢复:不小心删除数据库详解

    2024-01-18 21:23:29
  • Python中paramiko模块的基础操作与排错问题

    2023-06-21 04:45:33
  • Python简单实现阿拉伯数字和罗马数字的互相转换功能示例

    2021-08-29 08:52:57
  • Python WSGI的深入理解

    2021-04-20 21:48:25
  • Windows下mysql5.7.18安装配置教程

    2024-01-17 10:23:32
  • Go 处理大数组使用 for range 和 for 循环的区别

    2024-04-28 09:18:59
  • 怎么用Python识别手势数字

    2021-11-14 16:35:35
  • php实现比较全的数据库操作类

    2023-11-22 02:15:10
  • TensorFlow:将ckpt文件固化成pb文件教程

    2021-01-24 11:33:45
  • 使用Python制作自动推送微信消息提醒的备忘录功能

    2023-02-26 18:19:40
  • Golang中interface的基本用法详解

    2023-07-14 17:00:33
  • 仿DW的图形菜单 DIV+CSS

    2007-08-14 10:07:00
  • Python django搭建layui提交表单,表格,图标的实例

    2022-09-18 19:40:19
  • asp之家 网络编程 m.aspxhome.com