Python 抽象基类 ABC :从实践到优雅

今天我们来聊聊 Python 中的抽象基类(Abstract Base Class,简称 ABC)。虽然这个概念在 Python 中已经存在很久了,但在日常开发中,很多人可能用得并不多,或者用得不够优雅。

让我们从一个实际场景开始:假设你正在开发一个文件处理系统,需要支持不同格式的文件读写,比如 JSON、CSV、XML 等。

初始版本:简单但不够严谨

我们先来看看最简单的实现方式:

class FileHandler:
    def read(self, filename):
        pass
    
    def write(self, filename, data):
        pass

class JsonHandler(FileHandler):
    def read(self, filename):
        import json
        with open(filename, 'r') as f:
            return json.load(f)
    
    def write(self, filename, data):
        import json
        with open(filename, 'w') as f:
            json.dump(data, f)

class CsvHandler(FileHandler):
    def read(self, filename):
        import csv
        with open(filename, 'r') as f:
            return list(csv.reader(f))

这个实现看起来没什么问题,但实际上存在几个隐患:

  1. 无法强制子类实现所有必要的方法
  2. 基类方法的签名(参数列表)可能与子类不一致
  3. 没有明确的接口契约

改进版本:使用抽象基类

让我们引入 abc.ABC 来改进这个设计:

from abc import ABC, abstractmethod

class FileHandler(ABC):
    @abstractmethod
    def read(self, filename: str):
        """读取文件内容"""
        pass
    
    @abstractmethod
    def write(self, filename: str, data: any):
        """写入文件内容"""
        pass

class JsonHandler(FileHandler):
    def read(self, filename:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值