0

这是一个关于一个干净的、pythonic 的方式来处理一些不同的实例方法的问题。

我有一个类,根据某些输入,它的运作方式略有不同。差异似乎不足以证明产生全新课程的合理性。我必须将该类与几个数据“提供者”之一进行接口。当我介绍一本字典时,我以为我很聪明:

self.interface_tools={'TYPE_A':{ ... various ..., 'data_supplier':self.current_data},
                      'TYPE_B':{ ... various ..., 'data_supplier':self.predicted_data} }

然后,作为类初始化的一部分,我有一个输入“source_name”,我做......

# ... various ....
self.data_supplier = self.interface_tools[source_name]['data_supplier']

self.current_data并且self.predicted_data需要相同的输入参数,所以在调用方法时,我不必区分它们。我可以打电话

new_data = self.data_supplier(param1)

但是现在我需要连接一个新的数据源——称之为“TYPE_C”——它需要更多的输入参数。有很多方法可以做到这一点,但我想不出什么是非常干净的。例如,我可以将新参数添加到旧的 data_suppliers 而从不使用它们,所以调用看起来像

new_data = self.data_supplier(param1,param2,param3)

但我不喜欢那样。我可以添加一个 if 块

if self.data_source != 'TYPE_C':
    new_data = self.data_supplie(param1)
else:
    new_data = self.data_c_supplier(param1,param2,param3)

但是避免这样的 if 块正是我最初想用我想出的那本字典做的事情。

所以结果是:我有一些“data_supplier”例程。现在我的项目已经扩展,它们有不同的输入列表。但我希望我的班级能够尽可能一视同仁地对待他们。有任何想法吗?谢谢。

4

2 回答 2

1

听起来您的函数可能正在使用可变长度参数列表

也就是说,您也可以只创建子类。它们制造起来相当便宜,可以在这里解决您的问题。这几乎就是他们设计的情况。

于 2013-07-09T17:15:24.577 回答
1

你可以让你所有的 data_suppliers 接受一个参数,并把它变成一个字典或一个列表,甚至是一个 NamedTuple。

于 2013-07-09T17:20:06.173 回答