Python装饰器函数:实现函数扩展和函数包装
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
可以看到,obj1和obj2是同一个实例,说明使用了装饰器实现了单例模式。
总结来说,装饰器是一种强大的Python语法特性,可以在不修改原函数代码的情况下,为函数提供额外的功能或者包装函数,从而实现代码的复用和扩展。装饰器的应用非常广泛,可以用于日志记录、性能分析、事务处理等方面,可以说是Python中一种非常有用的技术。
