加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Python的装饰器

(2022-04-05 09:33:36)
分类: python

1.         装饰器本质上是闭包函数的语法糖

2.         函数式语言。指的是函数是一等公民,可作为变量使用。

3.         闭包函数。一个函数参数和返回值都是函数。可用于增强函数功能,面向切面编程(AOP

4.         闭包函数的返回值函数式对传入参数函数进行增强后的结果。

5.         装饰器等同于在第一次调用函数时执行以下语句:
print_odds = count_time_wrapper(print_odds)
然后可以直接print_odds()

6.         语法糖。指的是计算机语言中增加的某种语法,这种语法对语言的功能没有影响,但更方便程序员使用。
语法糖没有增加新功能,只是一种更方便的写法。
语法糖可以完全等价的转换为非语法糖的代码。

7.         装饰器的写法:@闭包函数名

8.         装饰器在第一次调用主函数的使用时增强。

9.         装饰器仅增强一次。第二次不再增强。

10.     对于含有返回值的函数(假设是没有参数的函数),调用闭包函数增强后,不能成功返回。但是成功增强了辅助功能。对于含有参数的函数,调用闭包函数增强后,不能成功接收参数。不能正常运行。

11.     一个函数有多个装饰器,则依次进行增强。

12.   装饰器的用法。这是最简单的,没有参数和返回值的主函数的情况。

def count_time_wrapper(func):

    def improved_func():

   start_time = time.clock()

func()

end_time = time.clock()

print("it takes {} s to find all odds".format(end_time - start_time))

return improved_func


@count_time_wrapper

def print_odds():

    for i in range(100):

   if i % 2 == 1:

   print(i)


if __name__ == '__main__':

 

    print_odds()


13.  以下两段代码完全等价,区别仅在于使用不使用装饰器。

@count_time_wrapper

def print_odds():

    pass

print_odds()


def print_odds():

    pass

print_odds = count_time_wrapper(print_odds)

print_odds()


14.  针对有参数和返回值的主函数:

def count_odds(lim = 100):

    cnt = 0

for i in range(lim):

   if i % 2 == 1:

   cnt += 1

return cnt

同时修改辅助的闭包函数:

def count_time_wrapper(func):

    def improved_func():

   start_time = time.clock()

ret = func()

end_time = time.clock()

print("it takes {} s to find all odds".format(end_time = start_time)

return ret

return improved_func

这样就解决了返回值的问题。


def count_time_wrapper(func):

    def improved_func(*args,**kwargs):

   start_time = time.clock()

ret = func((*args,**kwargs)

end_time = time.clock()

return ret

return improved_func

这样不仅返回值正常了,参数也正常了。这样就是一个完整的闭包函数。


15.一个主函数有多个装饰器:

@wrapper1

@wrapper2

等同于:

original_func = wrapper1(wrapper2(original_func))

original_func()






0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有