📜  python 装饰器 - Python (1)

📅  最后修改于: 2023-12-03 15:04:18.575000             🧑  作者: Mango

Python 装饰器

Python 装饰器是一个增强函数、方法或类的功能的函数。在 Python 中,所有的对象都可以作为参数传递给一个函数,也可以返回一个对象作为结果。

装饰器的基本思想

装饰器的基本思想是,定义一个函数,用于装饰其他函数、方法或类,使其具有额外的功能。

装饰器常常被用于以下场景:

  • 添加日志信息
  • 给函数添加权限控制
  • 为函数加上缓存
  • 进行性能测试
装饰器的代码实现

下面展示一个简单的装饰器代码示例,用于计算被装饰函数的运行时间:

import time

def time_it(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Time taken by {func.__name__}: {end_time-start_time} seconds")
        return result
    return wrapper


@time_it
def foo(n):
    s = 0
    for i in range(n):
        s += i
    return s

在上述代码中,time_it 函数定义了一个 wrapper 函数,该函数可以接受任意数量的位置参数和关键字参数,并在运行被装饰函数时计算其运行时间。然后,time_it 函数返回 wrapper 函数,从而可以使用该函数来装饰其他函数。

同时,在我们定义的函数 foo 上加上 @time_it 装饰器即可使用该装饰器。

装饰器的局限性

Python 装饰器有其局限性,它们并不能装饰所有类型的对象。Python 中只有可调用对象才能被装饰器装饰,比如函数、方法、类等,而不包括基本数据类型、字符串等对象。

此外,装饰器还可能会影响原始函数的元信息,如函数名、参数列表等。这些信息在装饰器中可能会发生改变。如果需要使用原始函数的元信息,则需要通过特殊的装饰器来保存这些信息。

结语

Python 装饰器是一个非常实用的功能,可以方便地为函数、方法或类添加额外的功能,如日志、权限控制、缓存、性能测试等。通过使用装饰器,我们可以让代码更加简洁、易于维护。