在将数据传递给类构造函数之前,在Python中预处理数据

在将数据传递给类构造函数之前,在Python中预处理数据,python,constructor,Python,Constructor,在将数据传递给构造函数之前(如果预处理很麻烦),创建一个单独的方法(在这种方法中我会预处理数据),这样做是否合适 class C(): def __init__(self, input, more_input): self.value = self.prepare_value(input, more_input) def prepare_value(self, input, more_input): #here I actually do some n

在将数据传递给构造函数之前(如果预处理很麻烦),创建一个单独的方法(在这种方法中我会预处理数据),这样做是否合适

class C():
    def __init__(self, input, more_input):
        self.value = self.prepare_value(input, more_input)

    def prepare_value(self, input, more_input): 
    #here I actually do some nontrivial stuff, over many lines  
    #for brevity I'm illustrating just a short, one-line operation
        value = (input + more_input)/2
        return value


print(C(10, 33).value) # has value 21.5

如果你想这样做,我建议你做两件事

  • 通过使用
    @staticmethod
    装饰器进行装饰,使
    prepare\u value()
    方法成为方法a。因为它没有对类本身的实例进行任何更改,只返回一个值,所以不应该将其作为实例的方法。因此,
    @staticmethod
  • 表示该方法只能通过使用名称
    \u prepare\u value()
    在内部使用。这实际上并没有使其私有化,但对其他开发人员(即未来的您)来说,“此方法不是为外部使用而设计的”,这是一个公认的惯例
  • 总的来说,我的建议是:

    class C():
        def __init__(self, input, more_input):
            self.value = self._prepare_value(input, more_input)
    
        @staticmethod
        def _prepare_value(input, more_input): 
            value = (input + more_input)/2
            return value
    

    是的,这似乎是明智的。请注意,您的术语并不完全正确。您没有在构造函数之前进行预处理。您正在构造函数中执行此操作。虽然它从来没有如此明确地说它总是明智的或它总是不明智的。这取决于您的类所做的事情,以及您是否分配了一个类太多的职责,并通过在其构造函数中需要大量的预处理将其与太多的其他功能相耦合。