gpt4 book ai didi

python - 混淆类和函数之间的界限

转载 作者:太空狗 更新时间:2023-10-30 01:13:23 25 4
gpt4 key购买 nike

我有一系列用于对数据进行分类的函数。每个函数都传递相同的输入。该系统的目标是能够随意加入新的分类功能,而无需进行任何调整。

为此,我使用了从 here 中提取的 classes_in_module 函数.然后,一个 python 文件中的每个分类器将在每个输入上运行。

但是,我发现将分类器实现为类或函数是很笨拙的。类意味着实例化和执行,而函数缺乏清晰的内省(introspection)以允许我查询名称或使用继承来定义公共(public)值。

这是一个例子。一、类实现:

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_listclasses_in_module 在包含 ClassifierA 等的文件上的输出:

result = []
for classifier in classifier_list:
c = classifier(data)
result.append(c.run())

但是,这似乎有点傻。这个类显然是静态的,并不需要维护它自己的状态,因为它只用了一次就被丢弃了。分类器实际上是一个函数,但后来我失去了共享 name 属性的能力——我将不得不使用丑陋的内省(introspection)技术 sys._getframe().f_code.co_name 并为每个分类器函数复制该代码。分类器之间的任何其他共享属性也将丢失。

你怎么看?我应该接受这种对类(class)的误用吗?或者有更好的方法吗?

最佳答案

函数可以有成员数据。您还可以使用 func_name 属性找到函数的名称。

def classifier(data):
return 1
classifier.name = classifier.func_name

print(classifier.name) #classifier

如果您希望多个函数以相同的方式运行,您可以使用装饰器。

function_tracker = []

def add_attributes(function):
function.name = function.func_name
function.id = len(function_tracker)
function_tracker.append(function)
return function

@add_attributes
def classifier(data):
return 1

print(classifier.name, classifier.id) # 'classifier', 0

在您的特定情况下,这是否可以避免上课?

关于python - 混淆类和函数之间的界限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35492692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com