子类和抽象类设计相关的 TypeError: __init_subclass__() 不接受关键字参数。

3
我使用抽象类及其子类来实现以下设计:
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。因此我的问题是如何修改子类以获得所需的控制。

1个回答

0

参考

我认为您没有完全理解属性的目的。

如果您创建了一个名为used_cols的属性,则使用obj.used_cols而不是obj.used_cols()进行访问。创建属性后,不容易直接调用底层函数。

CSV文件帮助

col_0,col_1,col_2,col_3
1,1,1,2
2,3,3,4
3,3,3,6

代码:

from abc import ABC, abstractmethod
import pandas as pd
class Pipeline(ABC):  

    @abstractmethod
    def read_data(self):
        pass
    
    def __init__(self, **kwargs):     
        self.raw_data = self.read_data()
        self.used_cols = kwargs["selected_cols"]
        self.process_data = self.raw_data[self.used_cols]

class case1(Pipeline):
    def read_data(self):
        return pd.read_csv("file_location.csv") # just hard coding for the file location

    @property
    def used_cols(self):
        return self._used_cols

    @used_cols.setter
    def used_cols(self,selected_cols):
        self._used_cols = selected_cols

selected_cols = ['col_2','col_3']
data = case1(selected_cols = selected_cols)
print(data.process_data)

结果:

   col_2  col_3
0      1      2
1      3      4
2      3      6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接