【发布时间】:2023-04-10 10:46:01
【问题描述】:
我正在编写一些 Python 代码,我们希望有几个不同的接口,一个公开为__init__,另一个通过@classmethod 公开。我正在寻找关于哪个界面应该去哪里的指导。
如果我们想象一个类计算具有不同幅度、相位和频率的正弦波之和,并且存储在对象中的是每个的数组。 __init__ 可能是:
class waveform:
def __init__(self, amplitudes, phases, frequencies):
self.amplitudes = amplitudes
self.phases = phases
self.frequencies = frequencies
为了允许将单个正弦波的参数组合在一起,我们添加了一个新对象,如下所示:
class singlewave:
def __init__(self, amplitude, phase, frequency):
self.amplitude = amplitude
self.phase = phase
self.frequency = frequency
然后我们可以在波形中添加一个@classmethod:
class waveform:
def __init__(self, amplitudes, phases, frequencies):
self.amplitudes = amplitudes
self.phases = phases
self.frequencies = frequencies
@classmethod
def from_waves(cls, listOfWaves):
amplitudes = [w.amplitude for w in listOfWaves]
phases = [w.phase for w in listOfWaves]
frequencies = [w.frequency for w in listOfWaves]
return cls(amplitudes, phases, frequencies)
或者,我们可以反过来让waveform 看起来像这样:
class waveform:
def __init__(self, listOfWaves):
self.amplitudes = [w.amplitude for w in listOfWaves]
self.phases = [w.phase for w in listOfWaves]
self.frequencies = [w.frequency for w in listOfWaves]
@classmethod
def from_components(cls, amplitudes, phases, frequencies):
waves = []
for a, p, f in zip(amplitudes, phases, frequencies):
waves.append(singlewave(a, p, f))
return cls(waves)
我发现第一个更优雅,因为它不需要在@classmethod 中创建额外的对象,并且__init__ 的参数与对象的属性直接相关。其他人更喜欢第二个,因为 __init__ 然后涉及将幅度、相位和频率绑定到一个对象中。
是否有一些规则或惯例表明其中一种优于另一种,或者纯粹取决于个人喜好?
谢谢。
【问题讨论】: