我正在阅读一些代码,其中作者正在使用我不熟悉的编码风格;他们把绝对的每个函数定义都放在一个类中。例如(删除详细信息以便不识别作者和代码库):
class CSVChecker:
@staticmethod
def is_ok(file):
#some stuff that could return False
return True
这就是本课程的结束。很多相似的。没有__init__
或self
。用法:if CSVChecker.is_ok(afile)
这只是一个奇怪的风格怪癖从其他语言转移到Python?或者是否存在Pythonic的原因,而不仅仅是文件顶层的def csv_check_file_ok(file):
?
答案 0 :(得分:1)
@deceze可能在他的评论中有答案。这些功能对象中的一些确实存储在列表中,并且列表的一些元素可以是“适当”对象的实例。剥离绝对基础:
class F1:
def __init__(self, a):
self.max=a
def ok(self, x):
return x < self.max
class F2:
@staticmethod
def ok(x):
return x > 0
别处
checkers = []
...
checkers.append( F1(i+j) )
checkers.append( F2 )
....
if ( all( check.ok(x) for check in checkers )
就我个人而言,我没有对@staticmethod
感到烦恼,只是编写了不需要使用虚拟def __init__(self): pass
进行任何初始化的类并实例化F2()
此外,可能还有一些遗留问题来自另一种语言(Java?)的样式,因为不是所有的单静态方法函数对象都以这种方式使用。同样,如果作者认为他们将来可能会如此使用,或者可能需要使用参数进行实例化,那么这是有道理的。
无论如何,我已经学到了一些东西,并希望其他人将来会这样做。
编辑后来添加:此用法与使用functools.partial
def f1( x, max=None ):
return x < max
#elsewhere ...
checkers.append( functools.partial( f1, max=i+j ))
现在思考哪个是最好的。此类的使用如何适合对象的“继承,组合,聚合”分类。
是否例外应该有一个 - 最好只有一个 - 明显的做法。 虽然这种方式起初可能并不明显,除非你是荷兰人。