装饰器的作用:用来装饰特定函数,
原则:不改变原来的函数代码,不改变函数调用方式,为函数增加新的功能
应用:假设我定义了一个登录页面的函数,登录后显示登录成功,我想,在不修改函数的同时让每次登录有个验证用户名和密码的过程,登录成功则执行函数,不成功提醒用户重新输入。
分析:1,定义一个函数 2,定义另一个函数,验证成功后执行这个函数命令
#!coding:utf-8
# Author:pymingming
user, pwd = 'ming','123'
#装饰器函数 = 高阶函数+嵌套函数组合
def verify(func):#外层函数
def deco(*args,**kwargs):#嵌套函数
while True:
username = input("please input your username:").strip()
password = input("please input your password:").strip()
if user == username and pwd == password:
func(*args,**kwargs)#func需要带括号,相当于执行login()
break
else:
print('invalid username or password, please input again!')
return deco #deco不能带括号, #login = verfity(login) = deco,相当于return verfity(login)
@verify #执行了上面的装饰函数 ,下面的函数其实在上面的函数内部被执行
def login():
print('welcome to visit this page')
login()
运行结果:
please input your password:mki
invalid username or password, please input again!
please input your username:ming
please input your password:123
welcome to visit this page
Process finished with exit code 0