为什么要在类中包含单个静态方法?

时间:2016-09-15 13:05:39

标签: python oop

我正在阅读一些代码,其中作者正在使用我不熟悉的编码风格;他们把绝对的每个函数定义都放在一个类中。例如(删除详细信息以便不识别作者和代码库):

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):

1 个答案:

答案 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 ))

现在思考哪个是最好的。此类的使用如何适合对象的“继承,组合,聚合”分类。

是否例外

应该有一个 - 最好只有一个 - 明显的做法。 虽然这种方式起初可能并不明显,除非你是荷兰人。