前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >装饰器

装饰器

作者头像
用户7798898
发布2022-05-06 14:40:46
发布2022-05-06 14:40:46
25400
代码可运行
举报
运行总次数:0
代码可运行

 一、装饰器的简单介绍

代码语言:javascript
代码运行次数:0
运行
复制
 1 # /usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 '''   装饰器   '''
 4 ''' 5     装饰器的工作原理
 6     1. python的执行顺序是从上到下顺序执行.
 7     2. 当执行到outer函数的时候, 将其内容放入内存, 执行到f1的时候.在f1上发现@outer装饰器.
 8     3. 执行outer函数, 并将其下的函数名f1作为参数传递给outer
 9     4. 将outer的返回值赋值给f1. 即f1=outer的返回值.  也就是f1重新指向outer的返回值
10     5. outer的返回值inner是函数, 也就是outer返回了一个函数. f1指向outer返回的inner函数.
11     6. 在后面调用f1(), 即调用inner()执行函数. 执行inner函数的内容.
12     7. 在inner函数中调用执行了func函数. func=原来的f1函数 , 调用func(),即执行原来的f1函数.返回结果r
13     8. inner的返回值是r, 新的f1函数的返回值也是r. 因此可以获得返回值, 并打印输出
14     8. 由于f1函数没有返回值, 默认返回none. 因此后来的f1函数的返回值是None.
15 '''
16 
17 
18 def outer(func):
19     def inner():
20         print("hello")
21         print( "hello" )
22         print( "hello" )
23         r = func()
24         print("end")
25         print( "end" )
26         print( "end" )
27         return r
28     return inner
29 
30 @outer
31 def f1():
32     print("FF1")
33 
34 
35 r = f1()
36 print(r)

 二、装饰器装饰带两个参数的函数

代码语言:javascript
代码运行次数:0
运行
复制
 1 # /usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 '''装饰器_带有多个参数'''
 4 
 5 #定义装饰器的时候,带有两个参数*args,**kwargs.可以用来接收动态参数.
 6 def outer(func):
 7     def inner(*args, **kwargs):
 8         print("Hello")
 9         r = func(*args, **kwargs)
10         print("End")
11         return r
12     return inner
13 
14 @outer
15 def f1(a,b):
16     print("执行带参数的函数")
17     return a+b
18 
19 r = f1(1,2)
20 print(r)

 三、多个装饰器装饰一个函数

代码语言:javascript
代码运行次数:0
运行
复制
 1 # /usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 '''多个装饰器装饰一个函数'''
 4 
 5 def outer(func):
 6     """
 7     装饰器1
 8     :param func:
 9     :return:
10     """
11     def inner(*args, **kwargs):
12         print("begin")
13         r = func(*args, **kwargs)
14         print("end")
15         return r
16     return inner
17 
18 def outer_1(func):
19     """
20     装饰器2
21     :param func:
22     :return:
23     """
24     def inner(*args, **kwargs):
25         print("predict")
26         r = func(*args, **kwargs)
27         return r
28     return inner
29 
30 
31 
32 
33 @outer_1
34 @outer
35 def f1(a1, a2, a3):
36     """
37     为这个函数使用两个装饰器
38     :param a1:
39     :param a2:
40     :param a3:
41     :return:
42     """
43     print("f1函数")
44     return a1 + a2 + a3
45 
46 f1(1,2,3)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档