python中的抽象类

抽象类(Abstract Base Class)

抽象类是不能直接创建实例 的类,用来规定子类必须实现哪些方法

Python 用 abc 模块实现,核心是两个东西:

  • ABC:继承它,就表示这是抽象类
  • @abstractmethod:标记「子类必须实现」的方法
python 复制代码
from abc import ABC, abstractmethod

class Animal(ABC):  # 继承 ABC,表示这是一个抽象类
    @abstractmethod
    def speak(self):
        """子类必须实现这个方法"""
        pass

# animal = Animal()  # TypeError: 不能实例化抽象类

class Dog(Animal):
    def speak(self):  # 必须实现抽象方法
        print("Woof!")

dog = Dog()
dog.speak()  # Woof!

定义抽象类

python 复制代码
from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        """计算面积"""
        pass

    @abstractmethod
    def perimeter(self):
        """计算周长"""
        pass

    def describe(self):
        """普通方法,子类可直接使用"""
        print(f"这是一个图形,面积: {self.area()}, 周长: {self.perimeter()}")

要点:

  • 继承 ABC → 抽象类
  • @abstractmethod 标记的方法 → 子类必须实现
  • 可以同时有普通方法(有默认实现)
  • 抽象类不能被实例化

抽象属性

方法之外,属性也可以要求子类必须提供:

python 复制代码
from abc import ABC, abstractmethod

class Employee(ABC):
    @property
    @abstractmethod
    def salary(self):
        """子类必须实现 salary 属性"""
        pass

class FullTimeEmployee(Employee):
    def __init__(self, monthly_salary):
        self._monthly_salary = monthly_salary

    @property
    def salary(self):
        return self._monthly_salary

emp = FullTimeEmployee(10000)
print(emp.salary)  # 10000
  • @abstractmethod:标记这个方法/属性必须被子类实现
  • @property:让子类实现后可以用 emp.salary 而不是 emp.salary() 来访问,像属性一样使用

两者组合起来就是:强制子类提供一个"属性",且调用方式像属性而非方法

注意: @property 要写在 @abstractmethod 上面,顺序不能颠倒。


子类必须实现全部抽象方法

少实现一个,子类本身仍是抽象类,照样不能实例化:

python 复制代码
class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

    # 忘记实现 perimeter 方法

# rect = Rectangle(3, 4)  # TypeError: 不能实例化抽象类 Rectangle

相关推荐
linux_cfan11 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
kyriewen12 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
郑州光合科技余经理12 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
IT_陈寒13 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
Blanche150013 小时前
利用 RAG 为答疑机器人扩展知识范围
前端
天若有情67313 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具
SoonITer14 小时前
怎样构建一个 Agent-friendly 的网站
前端·agent
颜进强14 小时前
01 · NestJS 是什么:用途、解决什么问题、与热门框架对比
前端·后端·ai编程
wendZzoo14 小时前
前端工程师的 3D 第一课:一个模型如何进入网页
前端
颜进强14 小时前
04 · NestJS 依赖注入:你在 `@Module` 写的 providers,和构造参数里那个类型,是怎么"对上"的?
前端·后端·ai编程