在类中创建方法的层次结构?

时间:2016-08-18 12:50:49

标签: python

我上课有数百种方法 我想创建一个层次结构,让我们轻松找到方法。

例如

class MyClass:
    def SpectrumFrequencyStart()...
    def SpectrumFrequencyStop()...
    def SpectrumFrequencyCenter()...
    def SignalAmplitudedBm()...

我想打电话使用:

MyClassObject.Spectrum.Frequency.Start()
MyClassObject.Spectrum.Frequency.Stop()
MyClassObject.Signal.Amplitude.dBm()

2 个答案:

答案 0 :(得分:0)

考虑使用字典将方法映射到键(分层字典,或简单地'。'分隔键)。

另一个可能更优雅的选择是namedtuples。类似的东西:

from collections import namedtuple
MyClassObject = namedtuple('MyClassObject', ['Spectrum', 'Signal'])
MyClassObject.Spectrum = namedtuple('Spectrum', ['Frequency'])
MyClassObject.Spectrum.Frequency = namedtuple('Frequency', ['Start', 'Stop'])
MyClassObject.Spectrum.Frequency.Start = MyClass.SpectrumFrequencyStart
  • 您可以使用inspection自动执行此操作,并解析方法名称,例如camel case,以自动构建命名元组。
  • 注意方法的绑定

答案 1 :(得分:0)

这只是一个非常糟糕的设计 很明显,SpectrumSignalFrequency(依此类推)应该是所有单独的类,远远少于&#34;数百种方法&#34;。<登记/> 我不确定MyClassObject是否实际上代表了什么,或者实际上只是一个命名空间 对象可以封装其他类的对象。例如:

class Frequency(object):

    def start(self):
        pass

    def stop(self):
        pass


class Spectrum(object):

    def __init__(self):
        self.frequency = Frequency()


class Amplitude(object):

    def dbm(self):
        pass


class Signal(object):

    def __init__(self):
        self.amplitude = Amplitude()


class MyClass(object):

    def __init__(self):
        self.spectrum = Spectrum()
        self.signal = Signal()


my_class_instance = MyClass()
my_class_instance.spectrum.frequency.start()
my_class_instance.spectrum.frequency.stop()
my_class_instance.spectrum.signal.amplitude.dbm()

Python PEP 8中有一个代码格式约定,因此我在我的示例中应用了它。