1、装饰器:用来为被装饰器对象添加新功能的工具(本身是可调用的任何对象,被修饰的对象也可以是任何可调用的对象) 器:具备某一功能的工具 装饰:指的是为被修饰对象添加新功能 开放封闭原则:封闭指的是对修改封闭,对扩展开放 装饰器的实现必须遵循两大原则: 1. 不修改被装饰对象的源代码 2. 不修改被装饰器对象的调用方式 装饰器的目标:就是在遵循1和2原则的前提下为被装饰对象添加上新功能 2、无参装饰器的模板: def outter(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper 3、有参装饰器的模板: def auth(x,y,z): def outter(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return warapper return outter 4、装饰器的语法糖:在被装饰对象正上方单独一行写@装饰器的名字 运行原理:python解释器一旦运行到@装饰器的名字,就会调用装饰器, 然后将被装饰函数的内存地址当作参数传给装饰器, 最后将装饰器调用的结果赋值给原函数名 5、叠加装饰器: 6、默写代码 补充:所有的数据类型的值自带布尔值,可以直接当作条件去用,只需要记住布尔值为假的那一些值即可(0,空,None) """ # dic_name = {"name": None} # def login(engine="file"): # def outter(func): # def wrapper(*args, **kwargs): # if dic_name["name"]: # print("无需再次登入") # res = func(*args, **kwargs) # return res # if engine == "file": # name = input("请输入用户名:").strip() # password = input("请输入登入密码:").strip() # if name == "jxl" and password == "123": # print("登入成功") # dic_name["name"] = name # res = func(*args, **kwargs) # return res # else: # print("登入失败") # elif engine == "mysql": # print("基于mysqlr认证") # elif engine == "ladp": # print("基于ldap认证") # # return wrapper # # return outter # # # import time # # # @login("file") # def index(): # time.sleep(3) # print("dfskdhfjsd") # index() # # @login("file") # def foo(): # print("213123") # return 123 # # print(foo()) # # # # dic_nme = {"name": None} # # # def auth(engilsh="file"): # def outter(func): # def wrapper(*args, **kwargs): # if dic_nme["name"]: # print("此用户已经登入,无需再次登入") # res = func(*args, **kwargs) # return res # if engilsh == "file": # name = input("name is :").strip() # password = input("password is :").strip() # if name == "jxl" and password == "123": # print("登入成功") # print("基于file认证") # dic_nme["name"] = name # res = func(*args, **kwargs) # return res # else: # print("密码或账户错误") # elif engilsh == "mysql": # print("基于mysql认证") # elif engilsh == "ladp": # print("基于ladp认证") # # return wrapper # # return outter # # # @auth("file") # def foo(): # print("fsdfsd") # # # foo() # # # @auth("file") # def foo1(): # print("ddfsf") # # # foo1()