25.装饰器
装饰器 原网站, 直接调用执行函数 def home(): print("---首页---") def american(): print("---欧美专区---") def japan(): print("---日本专区---") def shanghai(): print("---上海专区---") # 需求::1,网址一开始免认证,上线功能,对日本和上海专区进行认证 account = { "is_authenticated": False, "username": "caona", "password": "123" } def login(): if account["is_authenticated"] is False: username = input("user:") password = input("password:") if username == account["username"] and password == account["password"]: print("welcome to you ") account["is_authenticated"] = True else: print("wrong name or password") else: print("用户已经登陆成功") def home(): print("---首页---") def american(): print("---欧美专区---") def japan(): login() # 增加认证功能 print("---日本专区---") def shanghai(): login() # 增加认证功能 print("---上海专区---") home() japan() shanghai() # 对日本和上海板块,增减login认证功能,但是违反了软件开发中"开放和封闭原则"---》不能改变源代码前提下增加新功能---方法不通 # 需求2,在不改变调用方式的情况下增加功能 account = { "is_authenticated": False, "username": "caona", "password": "123" } def login(func): if account["is_authenticated"] is False: username = input("user:") password = input("password:") if username == account["username"] and password == account["password"]: print("welcome to you ") account["is_authenticated"] = True else: print("wrong name or password") if account["is_authenticated"] is True: func() def home(): print("---首页---") def american(): print("---欧美专区---") def japan(): print("---日本专区---") def shanghai(): print("---上海专区---") home() login(japan) login(shanghai) # 此方法,在没有修改源代码前提下,增加了新功能,但是,函数Japan和shanghang的调用方式发生变化,不是直接调用函数,而是当作参数传给了高阶函数,高阶函数内部调用。---方法不通 尝试不改变调用方式和不修改源代码继续修改,利用匿名函数 account = { "is_authenticated": False, "username": "caona", "password": "123" } def login(func): if account["is_authenticated"] is False: username = input("user:") password = input("password:") if username == account["username"] and password == account["password"]: print("welcome to you ") account["is_authenticated"] = True else: print("wrong name or password") if account["is_authenticated"] is True: func() def home(): print("---首页---") def american(): print("---欧美专区---") def japan(): print("---日本专区---") def shanghai(): print("---上海专区---") home() janpan = login(japan) # 类似匿名函数赋值,把login(japan)的执行结果赋值给新的变量Japan,与原函数名一致 shanghai = login(shanghai) japan() shanghai() # 此方法,没有改变调用方式,没有改变源代码,但是,在还没有调用japan()和shanghai()的情况下。login(japan),login(shanghai)就已经调用了两个函数 # 利用函数嵌套和闭包, account = { "is_authenticated": False, "username": "caona", "password": "123" } def login(func): def inner(): if account["is_authenticated"] is False: username = input("user:") password = input("password:") if username == account["username"] and password == account["password"]: print("welcome to you ") account["is_authenticated"] = True else: print("wrong name or password") if account["is_authenticated"] is True: func() return inner # 此时返回的是inner的内存地址,不执行 def home(): print("---首页---") def american(): print("---欧美专区---") def japan(): print("---日本专区---") def shanghai(): print("---上海专区---") home() janpan = login(japan) # 执行login,传入参数,返回inner内嵌函数内存地址,return inner 地址 shanghai = login(shanghai) japan() # japan()-====》inner()执行Japan就相当执行inner()函数。执行inner函数,进而执行真正的japan函数. shanghai() # # 此方法,不改变调用方式,不改变源代码实现新功能 # account = { "is_authenticated": False, "username": "caona", "password": "123" } def login(func): def inner(): if account["is_authenticated"] is False: username = input("user:") password = input("password:") if username == account["username"] and password == account["password"]: print("welcome to you ") account["is_authenticated"] = True else: print("wrong name or password") if account["is_authenticated"] is True: func() return inner # 此时返回的是inner的内存地址,不执行 def home(): print("---首页---") def american(): print("---欧美专区---") @login def japan(): print("---日本专区---") @login def shanghai(): print("---上海专区---") home() # janpan=login(japan) #执行login,传入参数,返回inner内嵌函数内存地址,return inner 地址 # shanghai=login(shanghai) japan() # japan()-====》inner()执行Japan就相当执行inner()函数。执行inner函数,进而执行真正的japan函数. shanghai() # 使用语法糖装饰器 #需求,是对Japan和shanghai的vip等级做限制,只有在3级以上,才能使用 account = { "is_authenticated": False, "username": "caona", "password": "123" } def login(func): def inner(*args, **kwargs): if account["is_authenticated"] is False: username = input("user:") password = input("password:") if username == account["username"] and password == account["password"]: print("welcome to you ") account["is_authenticated"] = True else: print("wrong name or password") if account["is_authenticated"] is True: func(*args, **kwargs) return inner # 此时返回的是inner的内存地址,不执行 def home(): print("---首页---") def american(): print("---欧美专区---") @login def japan(vip_level): if vip_level>3: print("---高端玩家专区---") else: print("---日本专区---") @login#装饰器,语法糖 def shanghai(vip_level): if vip_level > 3: print("---高端玩家专区---") else: print("---上海专区---") home() japan(2) # japan()-====》inner()执行Japan就相当执行inner()函数。执行inner函数,进而执行真正的japan函数. shanghai(4)