做网站付款方式,电子商务主要做什么工作,erp外贸管理系统,2345网址导航应用本文改编自以下文章#xff1a;Decorators in Python 装饰器是一个很强大的工具#xff0c;它允许我们很便捷地修改已有函数或者类的功能#xff0c;我们可以用装饰器把另一个函数包装起来#xff0c;扩展一些功能而不需要去修改这个函数代码。
预备知识
在Python中…
本文改编自以下文章Decorators in Python 装饰器是一个很强大的工具它允许我们很便捷地修改已有函数或者类的功能我们可以用装饰器把另一个函数包装起来扩展一些功能而不需要去修改这个函数代码。
预备知识
在Python中函数是第一类对象也就是说Python中的函数可以作为参数来使用或传递它具有如下属性
可以将函数存储在变量中可以将函数作为参数传递给另一个函数可以在函数中 return 另一个函数可以将函数存储在数据结构中如哈希表列表等
【例 1】将函数视为对象 在上面例子中我们把函数up赋值给变量up1。这个操作并不会调用函数而只是给函数up取了个别名up1。
【例 2】将函数作为参数传递 上面例子中函数dream的参数up和low也是函数
【例 3】从函数中 return 函数 这边比较绕注意create_adder(15)返回的是一个函数这个函数等同于adder并且其内参数x是15。
最简单的装饰器
这边给出一个装饰器 可以看到装饰器就是把一个函数作为参数传进去它本身也是个函数把传进去的函数包装完之后再把函数传出来。 我们把装饰器当成函数正常调用就是上面这样。当然装饰器有它特殊的用法比如像这样 它的工作逻辑就是把我定义的函数paper1当成参数传递给我的装饰器decorator再传出来当然我也可以把装饰器当成函数直接调用就是麻烦一点罢了。
装饰器的语法逻辑是这样的
decorator
def func():print(果壳小旋子)Above code is equivalent to -def func():print(果壳小旋子)func decorator(func)【例 4】计算代码运行时间的装饰器
# importing libraries
import time
import math# decorator to calculate duration
# taken by any function.
def calculate_time(func):# added arguments inside the inner1,# if function takes any arguments,# can be added like this.def inner1(*args, **kwargs):# storing time before function executionbegin time.time()func(*args, **kwargs)# storing time after function executionend time.time()print(Total time taken in : , func.__name__, end - begin)return inner1装饰器的作用很明显了当我需要计算某一个函数的运行时间时我只要找到那个函数的定义在前面calculate_time就行了不需要再一个一个修改函数当我不需要计算时间的时候把装饰器删掉就行了。
被装饰的函数需要传参有返回值
def hello_decorator(func):def inner1(*args, **kwargs):print(before Execution)# getting the returned valuereturned_value func(*args, **kwargs)print(after Execution)# returning the value to the original framereturn returned_valuereturn inner1上面的装饰器中的内层函数inner1可以接收参数*args, **kwargs并且可以返回值returned_value。*args表示可以接受任意长度的位置参数**kwargs表示可以接受任意长度的关键字参数。
多个装饰器连用
如果我有多个装饰器来装饰同一个函数会是什么情况首先定义两个装饰器
# code for testing decorator chaining
def decor1(func):def inner():x func()return x * xreturn innerdef decor(func):def inner():x func()return 2 * xreturn inner装饰器decor将函数返回值加倍装饰器decor1将函数返回值乘方 等价于
decor1(decor(num))
decor(decor1(num2))