Python 初始—(装饰器)
本质上也是函数的另一种表现形式,为其它函数丰富其功能,装饰其他函数,附加功能
在不改变被装饰的函数的源代码,而且不改变被装饰的函数的调用方式,因此被装饰的函数感知不到装饰器函数的存在
分解装饰器
- 函数即变量
- 高阶函数
- 嵌套函数
函數从上往下依次执行,函数会在内存中创建,当函数未创建,当引用时,在内存中找不到,会出错!!
其中这个函数被引用时,则也是引用这个函数在内存中的空间,于是会出现引用计数
高阶函数
把一个函数当成实参传给另一个函数(在不改变被修饰函数的源代码的情况下为被装饰的函数添加新的功能)
返回值中包含函数名,可以对返回值中的函数的内存地址进行引用进一步对被修饰的函数进行装饰(同时也是不改变被装饰的函数代码的情况下)
嵌套函数
函数即变量,在函数内中定义一个函数,用def去声明一个函数,嵌套函数的作用域只能在函数内,相当于函数内的局部变量
下面实现一个用装饰器模拟的一个网站安全认证的小例如下:
1 user, passwd = 'jim', '123456' 2 3 4 def auth(auth_type): 5 def dif_auth(func): 6 def wrapper(*args, **kwargs): 7 if auth_type == "local": 8 user_name = input("请输入用户名").strip() 9 pwd = input("请输入密码").strip() 10 if user_name == user and pwd == passwd: 11 print("\033[32;1m登录成功 \033[0m") 12 return func(*args, **kwargs) # 返回值 13 else: 14 exit("\033[31;1m用户名 or 密码输入有误 \033[0m") 15 elif auth_type == "internet": 16 pass 17 18 return wrapper; 19 20 return dif_auth 21 22 23 @auth(auth_type="local") 24 def index(): 25 print("这是网站主页") 26 27 28 @auth(auth_type="internet") 29 def detail(): 30 print("网站详情页") 31 32 index() 33 detail()