装饰器:不改变原来函数的代码和调用方式,给函数添加新功能。
装饰器,本身也是一个函数
添加装饰器格式 @函数名
加上装饰器后,就可以扩展没有的功能,比如说打印函数名、运行时间等,就不用写重复的代码
#给函数加上打印函数名的功能 def func_name(func): def f(*args,**kwargs): print("[DEBUG]:Enter the function %s()"%(func.__name__)) func(*args,**kwargs) return f # 给函数打印运行时间 def timer(func): import time def f(*args,**kwargs):#带参数 start_time = time.time() result = func(*args,**kwargs) #获取函数返回值 run_time = time.time() - start_time print("函数 %s() 运行时间是 %s"%(func.__name__,run_time)) return result #return函数返回值 return f # 带返回值的函数 @timer def sum(a,b): return a+b @timer def say(name,count): print('%s hello! %s'%(name,count)) say('nana',5) result = sum(2,5) print("sum函数的返回值是%s"%result)
例子:判断是否登陆的装饰器
import os def login(): username = input("请输入用户名") password = input("输入密码") if username == 'nn' and password == '123': with open(username,'a+') as fw: return True #走到这里就为真 return False #不然就为假 def is_login(func): def new_func(*args,**kwargs): username = args[0] if os.path.exists(username):#如果登陆成功这个文件会被创建,所有判断存在与否 result = func(*args,**kwargs) return result else: if login(): result = func(*args,**kwargs) return result else: print("登陆失败,重新登录!") return new_func @is_login def buy(username): print("购买") buy('nana')