Python 除了内置的 @classmethod 类方法与 @staticmethod 静态方法, 与之类似的装饰器还有: 标准模块 abc 提供的 @abstractmethod 抽象方法


使用 @abstractmethod 抽象方法:

  1. 所在的 class 继承 abc.ABC
  2. 给需要抽象的实例方法添加装饰器 @abstractmethod

完成这两步后, 这个 class 就变成了抽象类, 不能被直接实例化, 要想使用抽象类, 必须继承该类并实现该类的所有抽象方法


简单示例

from abc import ABC, abstractmethod


class Animal(ABC):
    @abstractmethod
    def info(self):
        print("Animal")


class Bird(Animal):
    # 实现抽象方法
    def info(self):
        # 调用基类方法(即便是抽象方法)
        super().info()
        print("Bird")

直接实例化基类

animal = Animal()

程序会报错 TypeError: Can’t instantiate abstract class Animal with abstract methods info

在派生类中实现所有基类的抽象方法后, 便可实例化

bird = Bird()
bird.info()

打印

Animal
Bird

abstractmethod 装饰器函数的内部实现

def abstractmethod(funcobj):
    funcobj.__isabstractmethod__ = True
    return funcobj

在上述示例中, 装饰器 @abstractmethod 的作用相当于设置了 Animal.info.__isabstractmethod__ = True, 继承了 abc.ABC 的类在实例化时会调用 __instancecheck__ 魔法方法, 该方法会检查该类所有抽象方法的实现情况


除了继承 abc.ABC, 也可使用 metaclass 达到相同的效果

from abc import abstractmethod, ABCMeta

class Animal(metaclass=ABCMeta):
    @abstractmethod
    def info(self):
        print("Animal")

如果抽象方法不仅是实例方法, 而且还是类方法或静态方法, 则应分别使用 @abstractclassmethod 和 @abstractstaticmethod

注解: abstractclassmethod 继承了 classmethod, abstractstaticmethod 继承了 staticmethod

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐