装饰器

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


posted @ 2023-10-05 21:39  苙萨汗  阅读(66)  评论(0)    收藏  举报