Python 除了内置的 @classmethod 类方法与 @staticmethod 静态方法, 与之类似的装饰器还有: 标准模块 abc
提供的 @abstractmethod 抽象方法
使用 @abstractmethod 抽象方法:
abc.ABC
完成这两步后, 这个 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