Skip to content

装饰器

装饰器(decorators)是 Python 中的一种高级功能,它允许你动态地修改函数或类的行为。

装饰器是一种函数,它接受一个函数作为参数,并返回一个新的函数或修改原来的函数。

装饰器的语法使用 @decorator_name 来应用在函数或方法上。

Python 提供了很多内置的装饰器,你可以使用它们来简化你的代码。

装饰器的作用

装饰器的作用主要有以下几点:

  1. 扩展函数的功能:装饰器可以扩展函数的功能,比如添加日志、性能测试、事务处理等功能。
  2. 动态修改函数:装饰器可以动态修改函数的行为,比如设置超时时间、缓存结果等。
  3. 包装函数:装饰器可以包装函数,比如监控函数的运行时间、记录函数的调用次数等。
  4. 重用代码:装饰器可以重用代码,比如实现缓存、权限校验等功能。

装饰器的语法

装饰器的语法如下:

python
@decorator_name
def function_name():
    # function body

其中,decorator_name 是装饰器的名称,function_name 是被装饰的函数名称。

内置装饰器

Python 提供了很多内置的装饰器,你可以使用它们来简化你的代码。

1. @staticmethod

@staticmethod 装饰器用来将一个方法转换为静态方法。

静态方法不需要实例化就可以调用,可以直接通过类来调用。

语法:

python
@staticmethod
def function_name():
    # function body

2. @classmethod

@classmethod 装饰器用来将一个方法转换为类方法。

类方法需要通过类来调用,而不是通过实例化对象。

语法:

python
@classmethod
def function_name(cls):
    # function body

3. @property

@property 装饰器用来将一个方法转换为属性。

属性是一种描述符,它允许你像访问实例变量一样访问方法。

语法:

python
@property
def function_name(self):
    # function body

4. @abstractmethod

@abstractmethod 装饰器用来定义抽象方法。

抽象方法是一种特殊的方法,它必须在子类中实现。

语法:

python
from abc import ABC, abstractmethod

class MyClass(ABC):
    @abstractmethod
    def function_name(self):
        pass

5. @coroutine

@coroutine 装饰器用来定义一个协程。

协程是一种特殊的生成器,它可以暂停并恢复执行。

语法:

python
@coroutine
def function_name():
    # function body

6. @contextmanager

@contextmanager 装饰器用来定义一个上下文管理器。

上下文管理器是一个特殊的对象,它可以管理资源的分配和释放。

语法:

python
@contextmanager
def function_name():
    # function body

7. @lru_cache

@lru_cache 装饰器用来缓存函数的返回值。

它可以缓存最近调用的函数的结果,避免重复计算。

语法:

python
@lru_cache(maxsize=128, typed=False)
def function_name(arg1, arg2):
    # function body

8. @singledispatch

@singledispatch 装饰器用来实现单分派。

单分派是指根据函数的第一个参数的类型来选择对应的函数实现。

语法:

python
from functools import singledispatch

@singledispatch
def function_name(arg):
    # function body

@function_name.register(int)
def _(arg):
    # function body for int

@function_name.register(str)
def _(arg):
    # function body for str