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

Python装饰器函数:实现函数扩展和函数包装

发布时间:2023-06-30 01:12:01

Python装饰器是一种函数,它可以在不修改原函数的情况下,为函数提供额外的功能或者包装函数。装饰器可以实现代码的复用和扩展,同时也可以增加函数的功能、管理函数的调用情况以及实现函数的包装等。

装饰器的基本原理是:将被装饰的函数作为参数传递给装饰器函数,然后在装饰器函数中对传入的函数进行处理,并返回处理后的函数。

下面通过实例来介绍装饰器的使用。

首先我们定义一个简单的函数,用于计算两个数字的和:

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

接下来,我们定义一个装饰器函数,用于在调用被装饰的函数之前和之后输出一些信息:

def print_info(func):
    def wrapper(*args, **kwargs):
        print("调用函数:%s" % func.__name__)
        print("参数:%s, %s" % (args, kwargs))
        result = func(*args, **kwargs)
        print("结果:%s" % result)
        return result
    return wrapper

在装饰器函数中,首先打印出要调用的函数的名字,然后打印出传入的参数,接着调用原来的函数并保存结果,最后打印出函数的返回结果,并将结果返回。

然后我们使用装饰器对原来的函数进行装饰:

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

这样,调用add函数时,会首先输出一些信息,然后计算两个数字的和,并返回结果。

接下来,我们测试一下:

add(1, 2)

输出结果为:

调用函数:add
参数:(1, 2), {}
结果:3

可以看到,在调用add函数的过程中,装饰器函数输出了函数的调用信息、参数和结果。

除了上面的例子,装饰器还有其他很多用法,比如实现单例模式、记录函数的执行时间、缓存函数的计算结果等。

例如,我们可以定义一个装饰器函数,用于实现单例模式,确保一个类只有一个实例:

def singleton(cls):
    instances = {}
    def wrapper(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return wrapper

在这个装饰器函数中,我们使用一个字典instances来保存类的实例。在每次调用被装饰的类时,首先检查字典中是否存在该类的实例,如果不存在则创建一个实例并保存到字典中,最后返回实例。

然后我们使用装饰器对类进行装饰:

@singleton
class MyClass:
    pass

这样,每次创建MyClass类的实例时,都会返回同一个实例:

obj1 = MyClass()
obj2 = MyClass()
print(obj1 is obj2)  # 输出 True

可以看到,obj1obj2是同一个实例,说明使用了装饰器实现了单例模式。

总结来说,装饰器是一种强大的Python语法特性,可以在不修改原函数代码的情况下,为函数提供额外的功能或者包装函数,从而实现代码的复用和扩展。装饰器的应用非常广泛,可以用于日志记录、性能分析、事务处理等方面,可以说是Python中一种非常有用的技术。