欢迎访问宙启技术站
智能推送

Python函数中的装饰器

发布时间:2023-05-20 19:50:18

1. 什么是装饰器

装饰器是Python中的一个重要概念,在功能语言中比较常见。这是一个运行时修改函数或类功能的函数。它们通过将其包装在另一个函数中来实现这一目的,从而将其修改。

Python中的装饰器就是用于对定义的函数进行外部的包装,装饰器本质上是一个函数,它可以动态地修改原函数的功能。

2. 装饰器的基本使用方法

Python使用“@”符号将一个函数用装饰器修饰,如下所示:

@decorator 
def function():
    print("hello world")

这种使用方式是一个语法糖,它等效于:

def function():
    print("hello world")
function = decorator(function)

3. Python函数中的装饰器的作用

装饰器可以用于Python中的许多方面,包括修改函数的行为、添加参数或参数检查、日志记录、性能分析等。

具体来说,装饰器的作用可概括为以下几点:

3.1 修改函数行为

装饰器可以用于修改一个函数的功能。例如,我们可以检查用户是否具有足够的权限来运行函数,或者为函数添加缓存功能,以避免重复计算。

示例:

def add_logging(func):
    import logging
    logging.basicConfig(level=logging.DEBUG)

    def wrapper(*args, **kwargs):
        logging.debug("Calling function %s with arguments %s %s" % (func.__name__, args, kwargs))
        return func(*args, **kwargs)

    return wrapper


@add_logging
def add(a, b):
    return a+b

print(add(2,3))

3.2 添加参数或参数检查

有时候我们在定义函数时会需要一些参数,但是我们不想在每个函数里都写一遍这些参数。在这种情况下,我们可以使用装饰器函数来向函数添加参数。

示例:

def add_args(*args, **kwargs): 
    def decorator(func):
        def wrapper():
            return func(*args, **kwargs)
        return wrapper
    return decorator


@add_args(3, 5)
def add(a, b):
    return a+b

print(add())

该示例中,装饰器将给函数添加了两个参数,并在调用函数时使用这些参数。

3.3 日志记录

装饰器还可以用于记录函数调用的日志。这很有用,因为这可以帮助我们跟踪哪些函数在何时被调用。

示例:

def log_call(func):
    def wrapper(*args, **kwargs):
        print("Calling %s with %s %s" % (func.__name__, args, kwargs))
        return func(*args, **kwargs)
    return wrapper


@log_call
def add(a, b):
    return a+b

print(add(2,3))

3.4 性能分析

装饰器可以用来评估函数的性能,帮助我们找出哪些函数需要优化。

示例:

import time

def time_it(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print("%s took %f seconds" % (func.__name__, end-start))
        return result
    return wrapper


@time_it
def add(a, b):
    return a+b

print(add(2,3))

以上装饰器会输出函数执行的时间。

4. Python函数中常用的装饰器

4.1 @staticmethod

该装饰器用于声明一个静态方法。静态方法通常被认为是与类而不是实例相关联的方法。

示例:

class Calculator:
    @staticmethod
    def add(a, b):
        return a + b

print(Calculator.add(2,3))

4.2 @classmethod

该装饰器用于声明一个类方法。类方法接受类本身作为 个参数,而不是实例。

示例:

class Calculator:
    PI = 3.14159265359

    @classmethod
    def circle_area(cls, radius):
        return cls.PI * radius ** 2

print(Calculator.circle_area(5))

4.3 @property

该装饰器使用将函数转换为属性。使用它可以使对象看起来更像一个属性而不是一个函数。这通常被用于读取对象的内部状态。

示例:

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        return self._radius

    @property
    def diameter(self):
        return self.radius * 2

    @property
    def area(self):
        return math.pi * self.radius ** 2

c = Circle(5)
print(c.radius)

5. 自定义Python函数装饰器

除了使用Python提供的装饰器外,我们还可以自定义装饰器,来实现一些特殊用途的功能。

下面是构建自定义装饰器的步骤:

1.创建一个函数,该函数会被用作装饰器。

2.该函数的参数应为一个函数。

3.在函数内部嵌套一个函数,该函数实现对输入函数的功能增强。

4.返回该嵌套函数的引用。

示例:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before function call")
        result = func(*args, **kwargs)
        print("After function call")
        return result
    return wrapper

@my_decorator
def add(a, b):
    return a+b

print(add(2,3))

这个示例中,我们定义了一个名为my_decorator的自定义装饰器,它将输出添加调用前和调用后的信息。add()函数使用该装饰器来装饰,即将绑定到该函数的代码被修改。函数的行为被嵌套的函数所修改,因此会引入函数前后的代码,并输出。

6. 总结

Python中的装饰器是一个非常有用的工具,可以帮助我们实现功能强大的函数和类。使用装饰器,我们可以动态地修改函数或类的行为,以满足不同的需求,使我们的代码更加优雅和灵活。同时,我们也可以定制自己的装饰器,帮助我们更好地处理函数和类的交互和运行。这使得Python成为了一个强大的编程工具,帮助我们解决各种问题。