2016-08-18 99 views
-5

我有上百种方法的课程 我想创建一个让他们容易找到方法的层次结构。在类中创建方法的层次结构?

例如

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

那我想用打电话:

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

不,你不能那样做。 “。”表示对对象属性的访问。由于您在'MyClass'中没有名为'Spectrum'和'Signal'的对象,因此无法完成。 – DeepSpace

+2

你究竟是什么意思?*“我想创建它们的层次结构,这将容易找到方法[原文如此]”*?你为什么不把它按照你所描述的路线分成更多更小的物体呢? – jonrsharpe

+1

好像你想要在对象中封装相关的方法块,并将该对象放在'MyClass.Spectrum'等中。 – khelwood

回答

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这和解析方法名,说骆驼情况下,自动建立namedtuples。
  • 讲究方法
+0

这显然是一个反模式。 – ElmoVanKielmo

+1

@ElmoVanKielmo这个问题从一个Antipattern开始。我假设他没有找人告诉他重写他的代码,对吧?他要求提供程序化解决方案。 我没有回答有关正确软件工程的问题。 欢迎您发表评论,但降低投票是过度的。解决方案很有用,即使只是给读者一个想法或方向。 – creativeChips

+0

http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem事实上,问题从一个反模式开始。问题X是一个非常糟糕的班级设计。 OP要求的解决方案Y是破解该语言,以便轻松访问数百种方法。必须明确指出,这不是要走的路。虽然我很欣赏你关于集合模块和方法绑定的知识,但我没有看到它如何帮助OP正确使用面向对象的编程范例。 – ElmoVanKielmo

0

结合这仅仅是一个很糟糕的设计。
很明显,Spectrum,Signal,Frequency(依此类推)应该是所有单独的类,远远少于“数百种方法”。
我不确定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因此我在我的例子中应用了它。