2016-08-18 78 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因此我在我的例子中應用了它。