Python全栈__函数的有用信息带参数的装饰器多个装饰器装饰一个函数

Posted 芒果不盲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python全栈__函数的有用信息带参数的装饰器多个装饰器装饰一个函数相关的知识,希望对你有一定的参考价值。

1、函数的有用信息

  代码1:

技术分享图片
 1 def login(username, password):
 2     """
 3     此函数需要用户名,密码两个参数,完成的是登录的功能。
 4     :return: True 登录成功。 False登录失败。
 5     """
 6     print(login.__name__)
 7     print(login.__doc__)
 8     print(登录成功...)
 9     return True
10 
11 print(login.__name__)
12 print(login.__doc__)
函数的有用信息__代码1:

  结果:

技术分享图片
D:Python36python.exe "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/03 函数的有用信息.py"
login

    此函数需要用户名,密码两个参数,完成的是登录的功能。
    :return: True 登录成功。 False登录失败。
    

Process finished with exit code 0
示例1结果

 

  代码2:

技术分享图片
 1 def wrapper(f):
 2     def inner(*args, **kwargs):
 3         print(f.__name__)
 4         print(f.__doc__)
 5         """执行函数之前的操作"""
 6         ret = f(*args, **kwargs)
 7         """执行函数之后的操作"""
 8         return ret
 9     return inner
10 
11 @wrapper
12 def login(username, password):
13     """
14     此函数需要用户名,密码两个参数,完成的是登录的功能。
15     :return: True 登录成功。 False登录失败。
16     """
17     print(登录成功...)
18     return True
19 
20 print(login.__name__)
21 print(login.__doc__)
22 login(1, 2)
函数的有用信息__代码2:

  结果:

技术分享图片
D:Python36python.exe "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/03 函数的有用信息.py"
inner
None
login

    此函数需要用户名,密码两个参数,完成的是登录的功能。
    :return: True 登录成功。 False登录失败。
    
登录成功...

Process finished with exit code 0
示例2结果

 

  代码3:

技术分享图片
 1 from functools import wraps
 2 
 3 def wrapper(f):
 4     @wraps(f)
 5     def inner(*args, **kwargs):
 6         """执行函数之前的操作"""
 7         ret = f(*args, **kwargs)
 8         """执行函数之后的操作"""
 9         return ret
10     return inner
11 
12 @wrapper
13 def login(username, password):
14     """
15     此函数需要用户名,密码两个参数,完成的是登录的功能。
16     :return: True 登录成功。 False登录失败。
17     """
18     a = 2
19     c = 4
20     print(登录成功...)
21     return True
22 
23 print(login.__name__)
24 print(login.__doc__)
25 for i in login.__dict__:
26     print(i)
27 print(dir(login))
函数的有用信息__代码3

  结果:

技术分享图片
D:Python36python.exe "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/03 函数的有用信息.py"
login

    此函数需要用户名,密码两个参数,完成的是登录的功能。
    :return: True 登录成功。 False登录失败。
    
__wrapped__
[__annotations__, __call__, __class__, __closure__, __code__, __defaults__, __delattr__, __dict__, __dir__, __doc__, __eq__, __format__, __ge__, __get__, __getattribute__, __globals__, __gt__, __hash__, __init__, __init_subclass__, __kwdefaults__, __le__, __lt__, __module__, __name__, __ne__, __new__, __qualname__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__, __wrapped__]

Process finished with exit code 0
示例3结果

 

2、带参数的装饰器

   代码:

技术分享图片
 1 def timer_out(flag1):  # falg1 = flag
 2     def timer(f):
 3         def inner(*args, **kwargs):
 4             if flag1:
 5                 start_time = time.time()
 6                 time.sleep(0.3)
 7                 ret = f(*args, **kwargs)
 8                 end_time = time.time()
 9                 print(执行效率%s % (end_time - start_time))
10                 return ret
11             else:
12                 ret = f(*args, **kwargs)
13                 return ret
14 
15         return inner
16 
17     return timer
18 
19 
20 flag = False
21 
22 
23 @timer_out(flag)  # 1,步 timer_out(flag) == timer 2,@与timer结合,变成你熟悉的装饰器 @timer
24 def func1():
25     print(111)
26 
27 
28 @timer_out(flag)
29 def func2():
30     print(222)
31 
32 
33 @timer_out(flag)
34 def func3():
35     print(333)
36 
37 
38 func1()
39 func2()
40 func3()
带参数的装饰器__示例:

  结果:

技术分享图片
D:Python36python.exe "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/04 带参数的装饰器.py"
111
222
333

Process finished with exit code 0
示例结果

 

  局部只能引用全局的变量,不能修改,如果要修改,global

技术分享图片
1 count = 1
2 
3 def func4():
4     count = count + 1
5     print(count)
6 
7 func4()
global

  结果:

技术分享图片
D:Python36python.exe "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/04 带参数的装饰器.py"
Traceback (most recent call last):
  File "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/04 带参数的装饰器.py", line 54, in <module>
    func4()
  File "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/04 带参数的装饰器.py", line 51, in func4
    count = count + 1
UnboundLocalError: local variable count referenced before assignment

Process finished with exit code 1
示例结果

 

  子函数只能引用父函数的变量,不能修改,如果要修改,nonlocal

技术分享图片
1 def func4():
2 
3     count = 3
4     def inner():
5         nonlocal count
6         count = count + 1
7         print(count)
8 func4()
nonlocal

 结果:

技术分享图片
D:Python36python.exe "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/04 带参数的装饰器.py"

Process finished with exit code 0
示例结果

 

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

技术分享图片
 1 def wrapper1(func): # func = f函数名
 2     def inner1():
 3         print(wrapper1 ,before func)  # 2
 4         func()
 5         print(wrapper1 ,after func)  # 4
 6     return inner1
 7 
 8 
 9 def wrapper2(func):  # func = inner1
10     def inner2():
11         print(wrapper2 ,before func)  # 1
12         func()  # inner1()
13         print(wrapper2 ,after func)  # 5
14     return inner2
15 
16 @wrapper2  # f = wrapper2(f) 里面的f新变量 = inner1 外面的f最新变量 = inner2
17 @wrapper1  # f = wrapper1(f) 里面的f函数名  外面的f新变量=inner1
18 def f():
19     print(in f)  # 3
20 
21 f() 
示例

   结果:

技术分享图片
D:Python36python.exe "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/05 多个装饰器装饰一个函数.py"
wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper2 ,after func

Process finished with exit code 0
示例结果

 

以上是关于Python全栈__函数的有用信息带参数的装饰器多个装饰器装饰一个函数的主要内容,如果未能解决你的问题,请参考以下文章

python_函数进阶

python装饰器内获取函数有用信息方法

python_如何定义带参数的装饰器?

带参数的装饰器,多个装饰器装饰一个函数,函数的有用信息。

python全栈闯关--12-装饰器进阶

对函数和方法使用相同的装饰器(带参数)