python 装饰器详解与应用范例
作者:不侠居 发布时间:2022-03-18 01:06:55
标签:python,装饰器
什么是装饰器
从字面意思上来看,装饰器是用来装饰其他东西的工具。在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 是面向对象的语言,所以程序抛出的异常也是类。常见的异常类1.NameError:尝试访问一个没有申明的变量2.ZeroDivi
- 大凡人世间的痛苦,多是因放不下有时候我常想,痛苦,该是时光刮给生命的一场飓风吧生活,本就是以这样一种特别的方式,掀起遮盖的一切,让你看到人生
- LABjs 是一个很小的 JavaScript 工具,用来根据需要加载 JavaScript 文件,通过使用该工具可以提升页面的性能,避免加
- 使用Python如何操作Redis呢?下面用实例来说明用Python读写Redis数据库。比如,我们插入一条数据,如下:import red
- 本文实例讲述了Python使用Matplotlib实现雨点图动画效果的方法。分享给大家供大家参考,具体如下:关键点win10安装ffmpeg
- 前言:WebDriver提供了两个关闭浏览器的方法,一个是前边使用quit()方法,另一个是close()方法close():关闭当前窗口q
- 转PDF初始代码从文件夹中读取图片数据,然后将他们保存为PDF格式。不长,大概10行代码。from PIL import Imagefrom
- MySQL有6种日志,监控数据库系统的时候必须知道select日志slow select日志变更日志二进制变更日志(binlog) 
- 基本原理使用Adodb.Stream读二进制文件然后进行解析,然后返回一数组第一个元素为类型(BMP JPG PNG GIF SWF)第二个
- 用于模式匹配的String方法:String支持4种使用正则表达式的方法:seach()用于检索,参数是一个正则表达式,返回第一个与之匹配的
- 使用suds这个第三方模块from suds.client import Clienturl = 'http://ip:port/?
- jinja2简介特征沙箱中执行强大的 HTML 自动转义系统保护系统免受 XSS模板继承及时编译最优的 python 代码可选提前编译模板的
- 欢迎来到 Python Httpx 教程。在本教程中,我们将深入探讨 Httpx 库,并学习如何使用它来构建高性能的异步网络应用程序。什么是
- 前言python的类分别有新式类和经典类,都支持多继承。在类的继承中,如果你想要重写父类的方法而不是覆盖的父类方法,这个时候我们可以使用su
- 先看一下flask-login模块的整体架构基础的信息和全局配置这里就不多说,需要用到再斟酌也可以的。这里也是针对每个模块较为常用的进行解释
- 以去掉去掉<!--和-->为例进行说明:def clearContentWithSpecialCharacter(content
- 前言:因为InnoDB是支持事务的,所以只对InnoDB的事务进行讨论。一、事务(一)什么是事务事务是由一组SQL语句组成的逻辑处理单元,是
- 今天为大家介绍一个Python绘制一朵漂亮的玫瑰花,用python的turtle库这个绘画库是非常简单的,但是还是需要你测试路径方向,慢慢调
- 这篇文章主要介绍了Python3如何对urllib和urllib2进行重构,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参
- strip_tags定义和用法strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。注释:该函数始终会剥离