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

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编程中非常有用的技术,可以帮助我们增加代码的复用性、可读性和可维护性。通过合理地使用装饰器,我们可以将功能的实现和功能的修饰分离开来,使得代码更加清晰和易于理解。