You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python抽象类开发:如何实现子类列表跨抽象类调用并筛选csv文件

问题解决方案

核心问题原因

你的代码存在2个核心错误导致无法拿到文件列表并完成筛选:

  1. colorReader类中__init__方法定义的colors是函数局部变量,没有绑定到实例对象,read_data_type方法无法跨作用域访问该变量,同时该方法没有定义返回值,所以执行后打印结果为None
  2. csvFileExtension类的逻辑中,直接迭代传入的PathReader类实例,而非调用实例方法获取路径列表,同时后缀拆分逻辑不够健壮(如果文件名包含多个.会匹配错误)

修复后完整代码

data_reader.py

from abc import ABC, abstractmethod
from config import colors_DATA_DIRECTORY
import os

class PathReader(ABC):
    @abstractmethod
    def read_data_type(self): 
        pass
    
class colorReader(PathReader):
    def __init__(self):
        self.path_to_types = os.path.join(colors_DATA_DIRECTORY, 'colors')
        # 将colors绑定为实例属性
        self.colors = []

    def read_data_type(self):
        for file in os.listdir(self.path_to_types):
            self.colors.append(os.path.join(self.path_to_types, file))
        # 方法返回路径列表
        return self.colors


class ExtensionReader(ABC):
    @abstractmethod
    def file_extension_reader(self): 
        pass

class csvFileExtension(ExtensionReader): 
    def __init__(self, file_type: PathReader):
        self.file_type = file_type
    
    def file_extension_reader(self):
        # 先调用PathReader实例的方法获取路径列表
        file_list = self.file_type.read_data_type()
        for file in file_list:
            # 用os.path.splitext更稳妥,避免文件名含多个点的匹配错误
            if os.path.splitext(file)[1] == '.csv':
                print(file) 


# 调用示例
if __name__ == "__main__":
    # 初始化路径读取类实例
    color_path_reader = colorReader()
    # 初始化后缀校验类实例,传入路径读取实例
    csv_checker = csvFileExtension(color_path_reader)
    # 执行筛选,打印csv文件路径
    csv_checker.file_extension_reader()

运行说明

执行上述修改后的data_reader.py文件,会输出如下结果(对应你的目录结构):

<你的项目实际路径>/my_dir/data/colors/light_colors.csv
<你的项目实际路径>/my_dir/data/colors/dark_colors.csv

内容的提问来源于stack exchange,提问作者zara kolagar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 04:06:03