Python装饰器:实现函数装饰器和属性装饰器
Python装饰器是一种用于增加函数或类功能的技术。它们可以在代码中以一种干净、简洁的方式实现常见的功能,如日志记录、验证、性能分析等。装饰器可以用来修改或扩展函数和类的行为,而无需修改其源代码。在本文中,我将介绍如何实现函数装饰器和属性装饰器。
函数装饰器
函数装饰器是一种用于修改函数行为的装饰器。它们可以在函数调用之前或之后执行其他操作,也可以替换或修改函数的返回值。函数装饰器可以用于实现一些常见的功能,如日志记录、缓存、输入验证等。
下面是一个例子,演示如何实现一个简单的函数装饰器,用于记录函数的执行时间:
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"函数 {func.__name__} 执行时间:{end_time - start_time:.2f} 秒")
return result
return wrapper
@timer
def my_function():
time.sleep(2)
my_function()
在上面的例子中,我们定义了一个名为timer的函数装饰器。它接受一个函数作为参数,并定义了一个内部函数wrapper。wrapper函数在调用被装饰的函数之前记录开始时间,然后调用被装饰的函数,并记录结束时间。最后,它计算出函数的执行时间,并打印出来。
通过在待装饰的函数前面加上@timer装饰器,我们可以在调用my_function时自动应用该装饰器。运行上面的代码,输出如下:
函数 my_function 执行时间:2.00 秒
这个例子只是其中一个可能的用例。你可以定义自己的装饰器,根据需要修改函数的行为。
属性装饰器
属性装饰器是一种用于修改类属性行为的装饰器。它们可以在访问或设置属性时执行一些额外的操作,例如类型验证、缓存等。
下面是一个例子,演示如何实现一个简单的属性装饰器,用于将属性名称转换为大写:
def uppercase_property(func):
attr_name = func.__name__
@property
def wrapper(self):
return getattr(self, attr_name).upper()
@wrapper.setter
def wrapper(self, value):
setattr(self, attr_name, value.upper())
return wrapper
class MyClass:
@uppercase_property
def my_property(self):
return self._my_property
@my_property.setter
def my_property(self, value):
self._my_property = value
obj = MyClass()
obj.my_property = "hello"
print(obj.my_property)
在上面的例子中,我们定义了一个名为uppercase_property的属性装饰器。它接受一个函数作为参数,并定义了一个内部函数wrapper。wrapper函数分别用作@property和@wrapper.setter的装饰器。
在MyClass类中,我们使用@uppercase_property装饰器来装饰my_property属性。这样,当我们访问或设置my_property属性时,会自动调用装饰器中定义的操作。运行上面的代码,输出如下:
HELLO
通过定义自己的属性装饰器,你可以在访问或设置属性时执行一些额外的操作,以满足特定的需求。
总结
通过使用装饰器,我们可以在不修改函数或类源代码的情况下,添加或修改其行为。函数装饰器可以修改函数的执行逻辑,属性装饰器可以修改属性的访问或设置行为。通过了解装饰器的工作原理,你可以自定义和应用各种功能强大的装饰器,并将其用于你的Python项目中。
