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()