【发布时间】:2016-02-18 21:23:22
【问题描述】:
我有一系列用于对数据进行分类的函数。每个函数都传递相同的输入。该系统的目标是能够随意添加新的分类功能,而无需进行任何调整。
为此,我使用了从here 提升的classes_in_module 函数。然后,一个 python 文件中的每个分类器将在每个输入上运行。
但是,我发现将分类器实现为类或函数是很笨拙的。类意味着实例化和执行,而函数缺乏清晰的自省来允许我查询名称或使用继承来定义公共值。
这是一个例子。一、类实现:
class AbstractClassifier(object):
@property
def name(self):
return self.__class__.__name__
class ClassifierA(AbstractClassifier):
def __init__(self, data):
self.data = data
def run(self):
return 1
然后可以以这种方式使用它,假设classifier_list 是包含ClassifierA 等文件的classes_in_module 的输出:
result = []
for classifier in classifier_list:
c = classifier(data)
result.append(c.run())
但是,这似乎有点愚蠢。这个类显然是静态的,并不真正需要维护自己的状态,因为它被使用一次并被丢弃。分类器实际上是一个函数,但是我失去了共享name 属性的能力——我将不得不使用丑陋的内省技术sys._getframe().f_code.co_name 并为每个分类器函数复制该代码。并且分类器之间的任何其他共享属性也会丢失。
你怎么看?我应该接受这种对课程的滥用吗?还是有更好的办法?
【问题讨论】:
-
你的分类器函数真的需要查找自己的名字吗?
-
也许妥协是使用
@staticmethod装饰器? -
@jwodder 这会让事情变得更方便。不过,您是对的,我可以解决名称问题。但是,抽象基类中还有其他共享属性,我没有在示例中包含。
-
@IanFiddes 函数有一个
func_name属性,还可以包含成员数据(参见下面的示例)
标签: python