装饰器(重点):
1、定议:本身是一个函数,为被装饰对象添加上新功能(如为原来的没有认证功能的函数增加认证功能)
2、原则:1) 不修改被装饰对象的源代码 2) 不修改被装饰对象的调用方式
3、实现软件开发原则:
封闭:已实现的功能代码块不应该被修改
开放:对现有功能的扩展开放
4、组成:
1)高阶函数 + 嵌套函数 》》》》就是装饰器
2)实现方式:
1、高阶函数:
函数名做为实参传给另外一个函数的形参(在不修改被装饰函数源代码的情况下为其添加功能)
反回值中包含函数名(不修改函数的调用方式)
2、嵌套函数:
把函数体作为内层函数,DEF外套一层函数,return 反回一个装饰函数的形参名
5、总结:
把被装饰的函数名作为实参传组装饰器函数,使用嵌套函数,return反回一个装饰函数的形参名,再把执行
装饰函数结果赋值给一个与被装饰函数名同名变量(或在被装饰函数前@装饰器函数名)
6、举例:
def login(func): #把要执行的模块从这里传进来
def inner():#再定义一层函数
_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:
func() # 看这里看这里,只要验证通过了,就调用相应功能
return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数
@login
def america():
#login() #执行前加上验证
print("----欧美专区----")
def japan():
print("----日韩专区----")
@login
def henan():
#login() #执行前加上验证
print("----河南专区----")