1.装饰器
定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能
原则:1.不能修改被装饰的函数的源代码
2.不能修改被装饰的函数的调用方式
实现装饰器的知识储备:
1. 函数即“变量”
2. 高阶函数
a. 把一个函数名当做实参传给另一个函数(在不修改被装饰函数源代码的情况下为期添加功能)
b. 返回值中包含函数名(不修改函数的调用方式)
3. 嵌套函数
4. 高阶函数+嵌套函数=装饰器
1.1 实现简单的装饰器
1 def outer(fun): 2 def warper(): 3 print("outer 1") 4 fun() #相当于把下边两个函数当参数传入进来 5 print("outer 3") 6 return warper 7 8 @outer 9 def test1(): 10 print("test1 2") 11 @outer 12 def test2(): 13 print("test2 2") 14 test1()
15 test2()
-----------------结果----------------- 16 outer 1 17 test1 2 18 outer 3 19 outer 1 20 test2 2 21 outer 3
1.2 装饰器传参
简单难度的传参
1 def outer(fun): 2 def warper(*args,**kwargs): 3 print("加的第一个功能在函数之前") 4 fun(*args,**kwargs) 5 print("加的第二个功能在函数之后") 6 return warper 7 8 @outer 9 def test1(*args,**kwargs): 10 print(args,kwargs) 11 return 12 13 14 test1(123,"waa","yyy",name="wsy",Age=18) 15 ----------------结果---------------------- 16 加的第一个功能在函数之前 17 (123, 'waa', 'yyy') {'name': 'wsy', 'Age': 18} 18 加的第二个功能在函数之后
中等难度的传参
加入time模块记录执行时间
import time def timer(func): def deco(*args,**kwargs): start = time.time() print("装饰器:功能1") func(*args,**kwargs) print("装饰器:功能2") end = time.time() print("func run time is %s" %(end - start)) return deco @timer def test1(): time.sleep(1) print("in the test1") @timer def test2(*args,**kwargs): time.sleep(1) print("in the test1",args,kwargs) test1() test2(1,2,3,4,name="wsy",age=20) --------------------结果------------------------ 装饰器:功能1 in the test1 装饰器:功能2 func run time is 1.0000572204589844 装饰器:功能1 in the test1 (1, 2, 3, 4) {'name': 'wsy', 'age': 20} 装饰器:功能2 func run time is 1.0000572204589844
多重认证 第一个页面认证成功直接进入其他两个页面
1 user,passwd = "wsy","123" 2 def auth(auth_type): 3 print("auth func:",auth_type) 4 def outer_wrapper(func): 5 def wrapper(*args,**kwargs): 6 print("wrapper func args:", *args,**kwargs) 7 if auth_type == "local": # 如果装饰器参数是local 就 8 username = input("Username:").strip() # 输入用户名 9 password = input("Password:").strip() # 输入密码 10 if user == username and passwd == password: # 判断如果正确 11 print("