Bootstrap

闭包与装饰器

闭包

  • 闭包的定义:闭包是指在一个外部函数中定义了一个内部函数,这个内部函数引用了外部函数的局部变量,并且外部函数返回了这个内部函数。返回的内部函数被称为闭包。
  • 闭包的作用:闭包的主要作用是保存外部函数的变量状态,即使外部函数已经执行完毕,这些变量仍然可以被内部函数访问。这使得闭包能够实现函数之间的数据共享和封装。
  • 形成条件:闭包的形成需要满足三个条件:有外部函数,外部函数内有内部函数,内部函数使用了外部函数的变量,并且外部函数返回了内部函数。例如:
    def outer(msg):
        message = msg
        def inner():
            print(message)
        return inner
    closure = outer("Hello, World!")
    closure()  # 输出 "Hello, World!"
    

装饰器

  • 饰器的定义:装饰器是一种特殊类型的闭包,它用于在不修改原函数代码的情况下,增加函数的功能。装饰器本质上是一个接受函数作为参数并返回新函数的高阶函数。
  • 装饰器的作用:通过装饰器,可以对已有函数进行扩展,增加诸如日志记录、性能测试、权限校验等功能。这提高了代码的重用性和模块化。
  • 形成条件:装饰器的形成条件包括不修改原函数源代码、不改变原函数调用方式、为原函数增加额外功能。装饰器的参数有且只有一个,并且是函数类型。例如:
    def log_decorator(func):
        def wrapper(*args, **kwargs):
            print(f"{func.__name__} function is called.")
            return func(*args, **kwargs)
        return wrapper
     @log_decorator
     def my_function():
         print("This is my function.")
     my_function()  # 输出 "my_function function is called." 和 "This is my function."
    

    装饰器案例

  • # import copy
    #
    # import random
    # import time
    #
    # # 统计时间开销
    # datas = [random.randint(0, 10000) for i in range(10000)]
    # datas_copy = copy.copy(datas)
    #
    #
    # def time_cost(f):
    #     def calc():
    #         start = time.time()
    #         f()
    #         print(f"函数{f.__name__}消耗时间{time.time() - start}")
    #
    #     return calc
    #
    #
    # @time_cost
    # def my_fun1():
    #     datas.sort()
    #     print(datas)
    #
    #
    # @time_cost
    # def my_fun2():
    #     new_datas = sorted(datas_copy)
    #     print(new_datas)
    #
    #
    # my_fun1()
    #
    # my_fun2()
    
    # 权限校验
    user = None
    
    
    def login_required(f):
        def check():
            global user
            if user:
                f()
            else:
                while True:
                    username = input('输入账号')
                    password = input('输入密码')
                    if username == 'admin' and password == '123456':
                        user = 'admin'
                        f()
                        break
                    else:
                        print('用户名或密码错误')
        return check
    
    
    def index():
        print('首页')
    
    
    @login_required
    def center():
        print("个人中心")
    
    
    @login_required
    def cart():
        print("购物车")
    
    
    index()
    center()
    cart()

;