如何为 class 方法正确组织 "helper" 方法

How to properly organize "helper" methods for a class method

我有一个 Python class 有几个“主要”方法,这些方法连续修改它的一个属性,例如

def method1(self):
    # modify an attribute of self
    return self

def method2(self):
    # modify the same attribute of self
    return self 

这些核心方法中的每一个依次调用多个“助手”class 方法,这些方法也修改相同的属性,即

def method1(self):
    self = self.helper_method1().helper_method2()
    return self

def method2(self):
    self = self.helper_method3().helper_method4()
    return self 

对于这些“辅助”方法应该在 class 中定义的位置(在什么级别)是否达成共识?

即这是:

def helper_method1_to_be_called_by_method1(self):
    # modify at attribute of self
    return self

def helper_method2_to_be_called_by_method1(self):
    # modify at attribute of self
    return self

def method1(self):
    self = self.helper_method1().helper_method2()
    return self

更喜欢这个(反之亦然):

def method1(self):

    def helper_method1_to_be_called_by_method1(self):
        # modify at attribute of self
        return self

    def helper_method2_to_be_called_by_method1(self):
        # modify at attribute of self
        return self

    self = self.helper_method1().helper_method2()
    return self

或者是否有第三种策略在性能、易读性和维护方面效果最好?

问题是您永远不知道您的设计应该有多灵活。一种极端情况是嵌套每个相关的辅助方法(您的方法 #2)。另一种极端情况是将每个辅助方法放在一个单独的文件(模块)中,并将其命名为“method1_helper_utils.py”。除非您事先知道确切的软件设计,否则我建议您这样做:

  1. 从方法 #1 开始
  2. 如果 main 方法与 helper 方法相结合变得太大(> 20-30 loc,或者任何对您来说合理的范围),或者不可读 - 将其设为 class 方法,如您在你接近#2
  3. 如果辅助方法对于 class 中的多个函数变得通用 - 再次将其设为 class 方法
  4. 如果辅助方法对于一个模块中的多个 class 是通用的 - 将它放在一个单独的文件中

嵌套函数可以访问其外部函数范围内的变量。也就是所谓的function closure。我相信,如果这不是您所需要的,那么在这种情况下可能不需要嵌套函数。