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

相关推荐
随便写个软件9 分钟前
【新版本】EasyExplorer资源管理器 3.12.0——地址栏重要更新
运维·服务器·前端·everything·资源管理器
Jack N12 分钟前
【Strapi 系列之二】Collection / Single / Component 怎么选?Strapi 字段大全一篇讲透
前端·javascript·strapi
hiahiahia12319 分钟前
Agent Tool 执行失败怎么办
服务器·前端
Java后端的Ai之路20 分钟前
09-React组件生命周期
前端·react.js·前端框架
IT_陈寒26 分钟前
SpringBoot开发实战:从入门到精通
前端·人工智能·后端
乘风gg26 分钟前
一个人一个月合并 2500 PRs 的秘密是什么?
前端·ai编程·claude
郑州光合科技余经理37 分钟前
本地生活服务系统:预约状态和进度通知接口怎么拆
java·开发语言·前端·javascript·后端·php·生活
Peter-Code1 小时前
Nginx 常用操作整理(前端)
服务器·前端·nginx
Java后端的Ai之路11 小时前
06-React-Props
前端·react.js·前端框架
Flynt11 小时前
开源"间谍卫星"说数据全是真的,我把它的免key数据源挨个试了一遍
前端·开源·数据可视化