我使用抽象类及其子类来实现以下设计:
我可以按如下方式调用
from abc import ABC, abstractmethod
class Pipeline(ABC):
@abstractmethod
def read_data(self):
pass
def __init__(self, **kwargs):
self.raw_data = self.read_data()
self.process_data = self.raw_data[self.used_cols]
class case1(Pipeline):
def read_data(self):
return pd.read_csv("file location") # just hard coding for the file location
@property
def used_cols(self):
return ['col_1', 'col_2','col_3','col_4']
我可以按如下方式调用
case1
类,实际上它将会把一个csv文件读取为pandas数据框。data = case1()
现有的设计将返回四个硬编码列,例如'col_1'、'col_2'、'col_3'和'col_4',目前运行良好。现在,我想通过修改子类来控制要返回的列,具体来说是used_cols
函数。我修改了case1
类如下,但会导致错误信息。
class case1(Pipeline):
def read_data(self):
return pd.read_csv("file location") # just hard coding for the file location
@property
def used_cols(self, selected_cols):
return selectd_cols
它被称为如下
selected_cols = ['col_2','col_3']
data = case1(selected_cols)
事实证明这种修改方法不正确,并生成错误消息,例如TypeError:init_subclass() takes no keyword arguments。因此我的问题是如何修改子类以获得所需的控制。