在数据处理任务中,一切都是例行公事。我们收到一个包裹(或一封信),阅读文件,处理文件,根据到达的文件集(例如,xlsx 文件)创建所需类型的报告,格式化报告,并将生成的文件发回。对于这样的任务,我构建了一个抽象类:
from pathlib import Path
from abc import ABC, abstractmethod # , abstractproperty
class IZI_report(ABC):
"""Class for reports."""
def __init__(self, path_to_files_folder: Path):
self.path_to_files_folder = path_to_files_folder
self.response = { # dict_to_return
"exit_is_ok": False,
"exit_message": "",
# ...
}
@abstractmethod
def files_reading(self, path_to_files_folder):
...
@abstractmethod
def data_processing(self, **pd_files):
...
@abstractmethod
def excel_writer(self, path_to_files_folder, client_name, files):
...
@abstractmethod
def excel_file_formatting(self, file_to_attach):
...
这假设预文件已经在file_to_attach
. 但这并不重要。
一切都会好起来的,但是在 Windows 环境中使用本机库格式化 Excel 文件比不依赖于操作系统的“通用”文件快 10 倍。因此,该方法的每个具体实现 excel_file_formatting(self, file_to_attach)
对我来说都是这样的:
def excel_file_formatting(self, file_to_attach):
def o_excel_file_formatting(file_to_attach):
# используем медленный универсальный модуль
...
def w_excel_file_formatting(file_to_attach):
# используем быстрый windows-модуль
...
return (w_excel_file_formatting if current_os_is_win else o_excel_file_formatting)(file_to_attach)
但在我看来并不漂亮。由于每个特定的方法都重复编写了提供格式化的辅助函数。例如o_header_wrap_and_size
或o_search_and_colorise
。我认为这个名字清楚地表明了他们的工作。如果它们到处都是重复的,那么就违反了DRY原则。
可以将这些小辅助函数直接包含在抽象类中,但这在某种程度上违反了抽象类中方法的“比例性”。并且制作一个完整的类工厂而不是抽象类方法在某种程度上是可怕和麻烦的。
问题 - 在这种情况下创建方法的标准规则是什么被认为是正确的,“pythonic”?
似乎嵌套类会在这里做,不是吗?
但是,关于嵌套(内部,嵌套) 类被划分。有反对,有赞成。对此有什么建议吗?
有一种感觉,组合在这里可以提供帮助。你创建一个基类
ExcelFormatter
,实现WindowsExcelFormatter
和GenericExcelFormatter
。当然,它们应该提供相同的 API。在这种情况下,您通过调用基类的方法从报表类中提取低级格式化逻辑,并在初始化报表时
ExcelFormatter
设置实例和设置,定义系统。ExcelFormatter
我走的是创建嵌套类的路线,并在
__init__
.我希望这个实现不要太自命不凡。最后,这个解决方案适合我:重复的函数在类中描述,所以它们不需要在每个实现中重写。并且根据操作系统类型创建一个类是明确写出的。所以没有“隐藏”的影响。
同时,我会说,这样的实现有点“丑陋”))确实,为了创建一个类,有必要从类内部的父类继承,并明确指示抽象的名称班级。像这样:
class Windows_excel_file_formatting(IZI_report.Windows_excel_file_formatting)
总计,它有效,但我想要更优雅的东西。
创建一个直接从磁盘读取文件的测试类的示例,然后使用抽象类中描述的函数对其进行标记
search_and_colorise
...一切正常,但不知何故它并不优雅或其他什么,在创建类的过程中过度消耗资源。
我会很感激提示!