加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python3 装饰器

发布时间:2020-12-17 17:01:13 所属栏目:Python 来源:网络整理
导读:装饰器:本质就是函数,功能是为其他函数添加附加功能。 装饰器两大原则: ? ? 1、不修改被修饰函数的源代码 ? ? 2、不修改被修饰函数的调用方式 计算单个函数运行时间示例: import?timedef?test(l):????start_time?=?time.time()????res?=?0????time.sleep(1)

装饰器:本质就是函数,功能是为其他函数添加附加功能。

装饰器两大原则:

? ? 1、不修改被修饰函数的源代码

? ? 2、不修改被修饰函数的调用方式

计算单个函数运行时间示例:

import?time
def?test(l):
????start_time?=?time.time()
????res?=?0
????time.sleep(1)
????for?i?in?l:
????????res?+=?i
????stop_time?=?time.time()
????print('函数运行的时间:{}'.format(stop_time-start_time))
????return?res
print(test(range(100)))

如果计算一万个函数中每个函数运行时间,按照以前写法只能一个函数一个函数添加。工作量非常。如果是生产环境中函数,根本不能按照这样一个一个函数添加代码。


使用装饰器示例:

import?time
#?高阶函数
def?timmer(func):
????def?wrapper(*args,?**kwargs):
????????start_time?=?time.time()
????????res?=?func(*args,?**kwargs)
????????stop_time?=?time.time()
????????print('函数运行的时间:{}'.format(stop_time?-?start_time))
????????return?res
????return?wrapper

用法:

@timmer
def?test(l):
????res?=?0
????time.sleep(1)
????for?i?in?l:
????????res?+=?i
????return?res
print(test(range(100)))

装饰器的知识储备:

装饰器 = 高阶函数 + 函数嵌套 + 闭包

高阶函数:

1、函数接受的参数是一个函数名

2、函数的返回值是一个函数名

3、满足上述条件任意一个,都可称之为高阶函数

高阶函数模拟高阶函数代码示例:

def?test(func):
????return?func
def?foo():
????print('来自函数foo')
res?=?test(foo)
res()
foo?=?test(foo)
foo()

来自函数foo
来自函数foo

该示例满足了装饰器第二个条件,可以不修改被修饰函数调用方式,但是问题是没有为被修饰函数添加新功能

import?time
def?test(func):
????start_time?=?time.time()
????func()
????stop_time?=?time.time()
????print('函数运行的时间:{}'.format(stop_time?-?start_time))
????return?func
????
def?foo():
????print('来自函数foo')
????time.sleep(2)
????
foo?=?test(foo)
foo()
来自函数foo
函数运行的时间:2.0016732215881348
来自函数foo

该示例满足了装饰器第一个条件,可以不修改被修饰函数源代码,为被修饰函数foo添加新功能,问题是,修改了foo调用方式。

函数嵌套:

? ? 函数套函数

函数嵌套代码示例:

def?father(name):
????print('from?father?{}'.format(name))
????def?son():????????#?函数即变量
????????print('我的爸爸是{}'.format(name))
????print(locals())
????
father('xiaoming')
from?father?xiaoming
{'son':?<function?father.<locals>.son?at?0x000001ADA5B25BF8>,?'name':?'xiaoming'}

高级示例:

def?father(name):
????print('from?father?{}'.format(name))
????def?son():
????????print('from?son')
????????def?grandson():
????????????print('from?grandson')
????????grandson()?#?执行函数
????son()??????????#?执行函数
????
????
father('xiaoming')

闭包:在一个作用域里放入定义变量,相当于打一个包

? ? 包→嵌套

? ? 闭→封装

def?father(name):
????print('from?father?{}'.format(name))
????def?son():
????????print('我的爸爸是{}'.format(name))
????????def?grandson():
????????????print('我的爷爷是{}',format(name))
????????grandson()?#?执行函数
????son()??????????#?执行函数
????
????
father('xiaoming')

装饰器框架:

import?time
#?装饰器框架
def?timmer(func):
????def?wrapper():
????????func()
????return?wrapper
#?装饰器框架
????
def?test():
????time.sleep(3)
????print('test函数运行完毕')
test?=?timmer(test)??#?返回wrapper的内存地址
test()???????????????#?执行wrappper()
注意:@timmer?相当于?test?=?timmer(test)



(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读