Python抽象类开发:如何实现子类列表跨抽象类调用并筛选csv文件
问题解决方案
核心问题原因
你的代码存在2个核心错误导致无法拿到文件列表并完成筛选:
colorReader类中__init__方法定义的colors是函数局部变量,没有绑定到实例对象,read_data_type方法无法跨作用域访问该变量,同时该方法没有定义返回值,所以执行后打印结果为NonecsvFileExtension类的逻辑中,直接迭代传入的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
相关产品推荐
相关产品推荐

