首页 > 编程语言 > 详细

python装饰器

时间:2020-04-05 04:04:58      阅读:130      评论:0      收藏:0      [点我收藏+]
  • 什么是装饰器?

装饰器是装饰其它函数,为其它函数增加特定功能。在原来的函数上,增加一些限制或制约的条件,称为装饰器。

使用装饰器不会修改原函数的源码,也不会修改原函数的调用方式。

装饰器的基础知识有,函数也是变量,高阶函数,嵌套函数。

函数名和变量名一样只是一个变量的标识符,指向函数定义的内存地址。在函数定义中取调用其它函数时,不会立即调用调用该函数。

高阶函数的两个要求为,在函数形参中可以传递函数,函数的返回值包含函数名。

 1 import time
 2 def timer(func):      #定义装饰器函数
 3     def gcf():           #定义一个嵌套函数
 4         start_time=time.time()
 5         func()            #调用作为参数传入的函数名 
 6         end_time=time.time()
 7         print(程序运行时间,end_time-start_time)
 8     return gcf          #返回嵌套函数的函数名
 9 @timer
10 def foo():              #定义被装饰函数
11     time.sleep(1)
12     print(in foo)
13 foo()
14 #执行过程
15 #到达第二行,装饰器函数的定义,把装饰器函数整体加载到CPU
16 #到达第九行,语句的执行过程实际是foo=timer(foo),所以执行timer函数
17 #回到第三行,把嵌套函数gcf整体加载到CPU
18 #执行到第八行,返回一个嵌套函数名给装饰器函数timer,也即返回函数名给foo
19 #到达第十四行,执行返回的foo函数,又回到第三行,执行foo函数体
20 #到达第五行,执行func函数,转到第十行
21 #执行了func函数后,依次执行程序,直到结束程序

 

当被装饰函数中有参数时,参数传递过程遵循一定的规则。被装饰函数中有一个参数,使用以下方式。

import time
def timer(func):      #定义高阶函数,参数传递foo,装饰foo
    def gf(name):     #定义嵌套函数,装饰foo
        start_time=time.time()
        func(name)     #执行被装饰函数
        end_time=time.time()
        print(程序运行时间,end_time-start_time)
    return gf             #在高阶函数中返回嵌套函数
@timer
def foo(name):       #被装饰函数中有参数
    time.sleep(1)
    print(in foo,name)
foo(woniu)

 

被装饰函数有多个参数时,需要使用不定义参数传参

import time
def timer(func):
    def gf(*args,**kwargs):
        start_time = time.time()
        func(*args,**kwargs)
        end_time = time.time()
        print(程序运行时间为,end_time-start_time)
    return gf
@timer
def foo(name,age):
    time.sleep(1)
    print(in foo,name,age)
foo(woniu,24)

 

在装饰函数中传递参数,需要使用以下的规则

import time
def timer(timer_type):     #定义高阶函数作为装饰器,带有参数
    def outter(func):          #定义嵌套函数,参数为被装饰函数
       def inner(*args,**kwargs):      #定义嵌套函数,参数为被装饰函数的参数
          start_time=time.time()
          func(*args,**kwargs)         #调用被装饰函数
          end_time=time.time()
        return inner            #返回内层嵌套函数
    return outter               #返回外层嵌套函数
@timer(timer_type=‘min‘)
def foo(name,args):         #定义被装饰函数
    time.sleep(1)
    print(in foo,name,age)
foo(woniu,24)

 

被装饰函数有返回值,遵循如下规则

import timer
def timer(timer_type):    #定义高阶函数为装饰器函数,带有参数
    def outter(func):         #定义嵌套函数,参数为被装饰函数
        def inner(*args,**kwargs)     #定义嵌套函数,被装饰函数有参数
            start_time = time.time()
        res = func(*args,**kwargs)
        end_time = time.time()
        print(程序运行时间为,end_time-start_time)
            return res          #返回被装饰函数的返回值
        return inner           #返回内层嵌套函数
    return outter              #返回外层嵌套函数
@timer(timer_type=min)
def foo(name,age):        #定义被装饰函数,有返回值,有多个参数
    time.sleep(1)
    print(in foo,name,age)
    return name
print(foo(woniu,24))      #输出被装饰函数的返回值

 

python装饰器

原文:https://www.cnblogs.com/feng1014/p/12635121.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!