装饰器(重点)


装饰器(重点):

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("----河南专区----")
原文地址:https://www.cnblogs.com/wc-chan/p/8306827.html