定义:本质是函数,装饰其他函数
原则:
- 不能修改被装饰的函数源代码
- 不能修改被修饰的函数调用方式
实现:
- 函数即变量
- 高阶函数(把一个函数名当做实参传给另一个,从而实现不修改源代码来添加功能;返回值包含函数名,从而不修改函数的调用方式)
- 嵌套函数
import time def timer(fun): def deco(*args,**kwargs): start=time.time() fun(*args,**kwargs) stop=time.time() print("time =%s"%(stop-start))#记录运行时间功能 return deco#返回的是内存地址 @timer#t=timer(test2)() def test2(name): time.sleep(2) print("in the test2:",name) test2("hello")
装饰器就是给源代码添加功能,同时有不修改源代码和调用方式。
功能也可以添加多种,在函数上存在嵌套,如下图:
#_*_coding:utf-8_*_ user_status = False #用户登录了就把这个改成True def login(auth_type): #把要执行的模块从这里传进来 def auth(func): def inner(*args,**kwargs):#再定义一层函数 if auth_type == "qq": _username = "alex" #假装这是DB里存的用户信息 _password = "abc!23" #假装这是DB里存的用户信息 global user_status if user_status == False: username = input("user:") password = input("pasword:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status == True: return func(*args,**kwargs) # 看这里看这里,只要验证通过了,就调用相应功能 else: print("only support qq ") return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数 return auth def home(): print("---首页----") @login('qq') def america(): #login() #执行前加上验证 print("----欧美专区----") def japan(): print("----日韩专区----") @login('weibo') def henan(style): ''' :param style: 喜欢看什么类型的,就传进来 :return: ''' #login() #执行前加上验证 print("----河南专区----") # home() # america = login(america) #你在这里相当于把america这个函数替换了 #henan = login(henan) # #那用户调用时依然写 # america() # japan() henan("3p")