Python @abstractmethod 抽象方法

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值