由于没有真正实用经验,所以只记录基本用法,以免经常不用忘的太彻底。
简单说,decorator也是一个函数,可以在不更改另一个函数的情况下,改变或增加另一个函数的功能。
1,不使用装饰器。
def decoTest(func): print("before") func() print("after") def test(): print('Hello, World') decoTest(test)
为了达到在test()执行前后分别执行不同语句功能,将test作为参数,传入decoTest中。之后需要调用decoTest函数,如果想直接调用test来达到这个目的,需要使用装饰器。
2,使用@语法
def decoTest(func): print("before") func() print("after") return func @decoTest def test(): print('Hello, World') test
在decoTest中增加了返回值,返回传入的函数。相当于执行了decoTest(test)。所以结果与上面的相同。所以如果最后调用的是test(),将多输出一个Hello, World。
3,为解决2中调用test()多输出一个Hello, World。对decoTest进行包装,使它返回一个函数。
def decoTest(func): def wrapper(): print('before') func() print('after') return wrapper @decoTest def test(): print('Hello, World') test()
此时的输出不会再多一行。因为返回的是函数,执行test()相当是将test传入decoTest中,decoTest返回wrapper,此时因为执行的是test(),所以最终会执行wrapper()。
4,解决带参数函数的装饰。
def decoTest(func): def wrapper(a, b): print('before') func(a, b) print('after') return wrapper @decoTest def test(a, b): print('a + b =', a + b) test(2, 9)
结果为:
before a + b = 11 after
因为装饰器函数返回的是一个函数,所以可以接受参数。所以2,9也传入了wrapper中,所以返回正确。
5,使用*, **来解决参数数量的不确定性。
def decoTest(func): def wrapper(*args, **kwargs): print('before') func(*args, **kwargs) print('after') return wrapper @decoTest def test(a, b, c, d): print('sum =', a + b + c + d) @decoTest def test2(*args, **kwargs): print("%s, %s" % (args, kwargs)) test(2, 9, 10, 23) test2(2, 3, 5, a = 5, c = 2)
test和test2都实现了在本身函数之前之后分别输出某个语句。
6,装饰器函数也可以传入参数。
def deco(arg) : def decoTest(func): def wrapper(*args, **kwargs): print('before', arg) func(*args, **kwargs) print('after', arg) return wrapper return decoTest @deco("test") def test(a, b, c, d): print('sum =', a + b + c + d) @deco("test2") def test2(*args, **kwargs): print("%s, %s" % (args, kwargs)) test(2, 9, 10, 23) test2(2, 3, 5, a = 5, c = 2)
输出结果为:
before test sum = 44 after test before test2 (2, 3, 5), {'c': 2, 'a': 5} after test2
装饰器函数里面嵌套定义了两个函数。例子中装饰器函数为deco,deco返回的是函数decoTest,decoTest有一个函数参数,装饰器返回的函数可以接受另一个函数,而decoTest又返回了wrapper函数。所以decoTest函数可以接受多个参数并最终输出。
相关推荐
!!!CSDN的一个特性: 即使我...关于Python装饰器课程的课件代码相关文件, 文字版讲义见: https://blog.csdn.net/ncepu_Chen/article/details/106075394 视频版本讲义见: https://www.bilibili.com/video/BV1SZ4y1s7cv/
今天小编就为大家分享一篇关于Python装饰器限制函数运行时间超时则退出执行,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
python装饰器详解,python装饰器笔记心得
本工程是使用demo构建装饰器,以及装饰器的使用案例。 从最简单的装饰器到带参数的,带任意参数的,到类装饰器等。代码案例比较全。可作为学习参考与交流。
Python装饰器-失败用例自动重试
python装饰器是一个用于封装函数、方法或类的代码的工具,用来显式指定管理它们的代码。一次编写,可用于多种不同的情况。在python 的流行框架中,装饰器应用越来越广泛。用类设计装饰器,可以利用实例属性保持装饰...
Python装饰器decoder.py 装饰模式有很多经典的使用场景,例如插入日志、性能测试、事务处理等等,有了装饰器, 就可以提取大量函数中与本身功能无关的类似代码,从而达到代码重用的目的。下面就一 步步看看Python中...
python 装饰器(示例)
装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方法对函数...Python装饰器以两种形式呈现: 【1】函数装饰器在函数定义的时候进行名称重绑定,提供一个逻
python 装饰器概述装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。代码de
接口测试使用Python装饰器.doc
Python36_01----python装饰器
本文实例讲述了Python装饰器用法。分享给大家供大家参考,具体如下: 写装饰器 装饰器只不过是一种函数,接收被装饰的可调用对象作为它的唯一参数,然后返回一个可调用对象(就像前面的简单例子) 注意重要的一点,...
异步属性的Python装饰器。 的Python:3.6+ 免费软件:MIT许可证 说明文件: : 包: : 源代码: : 安装 要安装async_property,请在您的终端中运行以下命令: $ pip install async-property 或者,如果您有...
python装饰器的详细接受,适用于小白刚接触到函数,想要弄清楚什么是装饰器,希望大家喜欢,喜欢的话记得点赞哦!谢谢!!!
python装饰器的4中类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类的详细说明。
python装饰器(csdn)————程序
python装饰器的引入到最终的应用实例,对python装饰的精华部分进行解读,明确写出了理解语法的关键要点。
Python 装饰器如果函数 xxx_1 作为参数传入 xxx_2 函数并被其使用,且在最后改变了 xxx_2 函数的返回结果,我们便称函数 xxx_2 为装饰