装饰器

发布时间 2023-06-05 16:47:04作者: Maverick-Lucky

闭包函数

闭包函数的定义

  闭:在函数的内部定义函数,至少定义两层函数

  包:内部的函数使用外部的函数名称空间中的名字

# 使用场景:闭包函数是第二种传参的方式,一次传参,多次调用

装饰器

装饰器的核心思想:在不改变被装饰对象内部代码和原有的调用方式基础之上在添加额外的功能

统计函数的执行时间

#时间模块
import time
def outer(func):
    def get_time():
    #函数执行之前的时间点
        start_time = time.time
        func()
    #函数执行之后的时间点
        end_time = time.time
        print('函数执行了%秒' % (end_time - start_time))
    return get_time

def index():
    time.sleep(2)
    print('from index')
index = get_time(index)
index()

有参数版本

import time
def outer(func):
    def get_time(*args, **kwargs)
        start_time  = time.time()
        func(*args,**kwargs)
        end_time = time.time
        print('函数执行了%秒' % (end_time - start_time))
    return get_time


def index():
    time.sleep(2)
    print('from index')
index = outer(index)
index()

有返回值版本

import time
def outer(func):
    def get_time(*args, **kwargs):
        start_time = time.time
        func(*args, **kwargs)
        end_time = time.time
        res =end_time -start_time
        return res
    return get_time

def index():
    time.sleep(2)
    print('from index')
index = outer(index)
index()

登录认证功能

def login_auth(func):
    def auth(*args, **kwargs):
        #登录功能
        username = input('username:').strip()
        password = input('password:').strip()
        #判断 用户名和密码是否正确
        if username == 'kevin' and password =='123'
            print('登录成功')
            res = func(*args, **kwargs)
            return res
        else:
            print('用户名或密码错误')
     return auth

@login_auth
def index():
    print('from index')

装饰器的固定模版(语法糖)

def outer(func):
    def inner(*args, **kwargs):
        # 函数执行之前可以添加的功能
        res = func(*args, **kwargs)
        #函数执行之后可以添加的功能
        return res
    return inner

@outer
def index():
    pass
index()

双层语法糖

双重语法糖从下往上走、多重语法糖也是一样的道理,最后都是index = 最上层修饰器(下一层修饰器内部函数) 

def a(func):
    print('a')

    def inner_a(*args, **kwargs):
        print('inner_a')
        res = func(*args, **kwargs)  # 4.inner_b = func  调用inner_b
        return res

    return inner_a


def b(func):
    print('b')

    def inner_b(*args, **kwargs):
        print('inner_b')
        res = func(*args, **kwargs)  # 5.index = func  调用 index
        return res

    return inner_b


@a  # 2. index = a(inner_b)
@b  # 1. inner_b = b(ineer_b)
def index():
    pass


index()  # 3. inner_a = a(inner_b)  调用inner_a

 装饰器修复技术

确保被装饰函数不会因为装饰器带来异常问题

from functools import wraps   # 提出
def a(func):
    print('a')
    @wraps(func)    # 装饰
    def inner_a(*args, **kwargs):
        print('inner_a')
        res = func(*args, **kwargs)
        return res

    return inner_a
@a
def index():
    pass

index()

有参装饰器

def outer(source_data,a,b, *argssss, **kwargsssss):
    # source_data = 'file'
    def login_auth(func):
        def auth(*args, **kwargs):
            # source_data = args[0]
            if source_data == 'file':
                # 来自于文件
            elif source_data == 'mysql':
                # 来自于mysql
            elif source_data == 'oracle':
                # 来自于oracle

            if username =='kevin' and password == '123':
                print('成功')
                func()
            else:
                print('失败')
        return auth
   return login_auth
# @login_auth # index=login_auth(index)
@outer('file'1,2)
def index():
    pass

index('file')