装饰器
装饰器
定义:本质是函数,装饰其他函数,就是为其他函数添加附加功能。
原则:1.不能修改被装饰函数的源代码
2.不能修改被装饰函数的调用方式
知识储备:
1.函数即“变量”
2.高阶函数:
a.把一个函数名以实参的形式传给另一个函数(在不修改被修饰函数源代码的情况下为其添加新功能)
b.返回值中包含函数名(不修改函数夫人调用方式)
3.嵌套函数:在函数中定义一个函数
装饰器实例;
1 #Task:给test添加一个计时函数 2 import time 3 def timer(func): 4 def deco(): 5 start_time = time.time() 6 func() 7 stop_time = time.time() 8 print('the func time is %s '%(stop_time - start_time)) 9 return deco 10 @timer #test = timer(test)这就是所谓语法糖 11 def test(): 12 time.sleep(3) 13 print('in the test') 14 test()
Output:
in the test the func time is 3.0004241466522217
带参数的装饰器:
这段代码将验证方式分为两种,一种local,一种ldap,此段只实现local逻辑,ldap以print函数带过。
1 username, passwd = "sugar", "abc" 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": 8 user = input("Please input username:") 9 password = input("Please input passwd:") 10 if user == username and password == passwd: 11 print("\033[32;1msuccessful pass\033[0m") 12 res = func(*args, **kwargs) 13 print("------afterauth----") 14 return res 15 else: 16 exit("\033[31;1mInvalid username or password\033[0m") 17 elif auth_type == "ldap": 18 print(input("名场面:我信你个鬼,你个糟老头子,坏的很。。。")) 19 return wrapper 20 return outer_wrapper 21 22 def index(): 23 print("welcome to index page") 24 25 @auth(auth_type = "local")#先给装饰器传参数,再将home函数名作为参数传给outerwrapper(), 26 def home(): 27 print("welcome to home page") 28 return "from home" 29 30 @auth(auth_type = "ldap") 31 def care(): 32 print("welcome to care page") 33 34 index() 35 print(home()) 36 care()
优美胜于丑陋(Python 以编写优美的代码为目标)//
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)//
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)//
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)//
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)//
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)//
可读性很重要(优美的代码是可读的)//
即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)//
不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)//
当存在多种可能,不要尝试去猜测‘而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)。虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido )//
做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)//
如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)//
命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)//