1. 简介
"""
装饰器这个知识点它不是一个新的知识点,它是我们之前学的:名称空间、闭包函数、函数嵌套调用等知识点汇总而来的知识点.
"""
什么是装饰器:
器:就是工具
装饰:给被装饰的对象添加额外的功能
装饰器的核心思想:
就是在"不改变被装饰对象"内部的代码和"原有调用方式"的基础之上再"添加额外的功能"
# 背景知识
def index():
print("from index")
index()
# 现在让你统计index函数执行完毕之后的执行时间
# 时间模块
import time # 内置模块,可以直接拿来使用
def index():
time.sleep(3)
print('from index')
# 1. 在函数执行之前打印一个时间点
start_time = time.time()
index()
# 2. 在函数执行完毕之后在打印一个时间点
end_time = time.time()
# 3. 两者的差就是函数的执行时间
print("index函数一共执行了:%s秒" % (end_time - start_time))
2. 装饰器模板
def outer(func):
def inner(*args, **kwargs):
print('这个是函数执行之前可以添加的功能')
res = func(*args, **kwargs)
print('这个是函数执行之后可以添加的功能')
return res
return inner
3. 装饰器的语法糖
"""装饰器本质就是函数,函数就是功能"""
# 语法糖
@outer # index = outer(index)
def index():
print('from index')
@outer # home=outer(home) -----------> home是outer函数的返回值(内部函数的函数名)
def home():
print('from home')
home() # inner()
# index = outer(index)
index()
# home = outer(home)
# home()
"""
语法糖的书写规范:
紧贴着被装饰对象的上方写
语法糖的内部原理:
他会自定把被装饰对象的名字当成参数传给装饰器函数调用
"""
4. 有参装饰器
# 有参装饰器就是带参数的装饰器
# 先前我们学习的装饰器就是无参装饰器:不到参数的装饰器
def outter(type):
# type = 1
def login_auth(func):
# func = index
def auth(*args, **kwargs):
# 写登录功能
# 1.
username = input('username:').strip()
password = input('password:').strip()
# 2. 验证用户名和密码是否正确
# with open('')
"""
根据不同的参数用户名和密码来自于不同的位置
"""
if type == 'file':
print('用户名和密码来自于文件')
elif type == 'mysql':
print('用户名和密码来自于MySQL')
elif type == 'oracle':
print('用户名和密码来自于Oracle')
return auth
return login_auth
@outter('file') # @login_auth # 如果是index函数认证,用户名和密码来自于文件 login_auth(index, 1)
def index():
print('from index')
index()
# @login_auth # 如果是home函数认证,用户名和密码来MySQL
@outter('mysql') # 如果是home函数认证,用户名和密码来MySQL
def home():
print('from home')
home()