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



我使用抽象类和它的子类类实现了如下设计

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 dataframe中。

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()不接受关键字参数,所以我的问题是如何修改子类以获得所需的控件。

参考

  • Python:如何向属性getter传递多个参数?

我想你没有完全理解属性的目的。

如果您创建了一个属性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

最新更新