1. 程式人生 > >Python全棧__函數的有用信息、帶參數的裝飾器、多個裝飾器裝飾一個函數

Python全棧__函數的有用信息、帶參數的裝飾器、多個裝飾器裝飾一個函數

G1 lee 參數 sed 信息 back red cdc subclass

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:\Python36\python.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:\Python36\python.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:\Python36\python.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:\Python36\python.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:\Python36\python.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:\Python36\python.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:\Python36\python.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全棧__函數的有用信息、帶參數的裝飾器、多個裝飾器裝飾一個函數