Python装饰器的使用方法和常见例子
发布时间:2023-07-01 12:33:50
Python装饰器是一种高级技术,用于修改已有函数或类的行为而无需对它们进行直接修改。装饰器本质上是一个函数,接受待装饰的函数作为参数,并返回一个新的函数或类。装饰器通常用于在不修改原函数或类代码的情况下,添加额外的功能或修改其行为。
下面是一些常见的Python装饰器的使用方法和例子:
1. 函数装饰器:
函数装饰器是最常见的装饰器类型,它用于修改函数的行为。下面是一个简单的例子,用于记录函数的运行时间:
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}秒")
return result
return wrapper
@timer
def my_function():
# 函数的实现
pass
my_function()
2. 类装饰器:
类装饰器与函数装饰器类似,但可以用于装饰类而不仅仅是函数。下面是一个例子,用于为类的所有方法添加日志记录:
def logger(cls):
class Wrapper:
def __init__(self, *args, **kwargs):
self.wrapped_instance = cls(*args, **kwargs)
def __getattr__(self, item):
method = getattr(self.wrapped_instance, item)
if callable(method):
def wrapped_method(*args, **kwargs):
print(f"调用方法{item}")
return method(*args, **kwargs)
return wrapped_method
else:
return method
return Wrapper
@logger
class MyClass:
def my_method(self):
# 方法的实现
pass
my_class_instance = MyClass()
my_class_instance.my_method()
3. 类方法装饰器:
类方法装饰器用于装饰类的方法,并且可以访问类的方法和属性。下面是一个例子,用于检查类方法的参数是否合法:
def check_arguments(*allowed_types):
def decorator(method):
def wrapper(self, *args, **kwargs):
for arg in args:
if not isinstance(arg, allowed_types):
raise ValueError("参数类型不合法")
return method(self, *args, **kwargs)
return wrapper
return decorator
class MyClass:
@check_arguments(int, float)
def my_method(self, arg1, arg2):
# 方法的实现
pass
my_class_instance = MyClass()
my_class_instance.my_method(1, 2.0)
4. 属性装饰器:
属性装饰器用于装饰类的属性,并且可以对属性的访问和修改进行额外的操作。下面是一个例子,用于将属性的值限制在特定范围内:
def check_value_range(min_value, max_value):
def decorator(prop):
def getter(self):
return prop.__get__(self)
def setter(self, value):
if min_value <= value <= max_value:
prop.__set__(self, value)
else:
raise ValueError("属性值超出范围")
return property(getter, setter)
return decorator
class MyClass:
@check_value_range(0, 100)
def my_property(self):
return self._my_property
@my_property.setter
def my_property(self, value):
self._my_property = value
my_class_instance = MyClass()
my_class_instance.my_property = 50
以上是一些常见的Python装饰器的使用方法和例子。装饰器是Python编程中非常有用的技术,可以帮助我们增加代码的复用性、可读性和可维护性。通过合理地使用装饰器,我们可以将功能的实现和功能的修饰分离开来,使得代码更加清晰和易于理解。
