2016-08-18 8 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質問は、まず反パターンから始まります。私は彼がコードを書き直すように彼に言う人を探すのではないと思いますよね?彼は計画的な解決策を求めた。 私は適切なソフトウェア工学についての質問に答えなかった。 あなたはコメントを書いても構いませんが、downvotingは過剰です。ソリューションは読者にアイデアや方向性を与えても有用です。 – creativeChips

+0

http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem実際、問題は反パターンから始まります。問題Xは非常に貧弱なクラス設計です。 OPが求めている解決策Yは、何百もの方法へのアクセスを容易にするために言語をハックすることです。それは行く方法ではないことを明確に述べなければならない。コレクションモジュールとメソッドバインディングについての知識はありがたいですが、OPがオブジェクト指向プログラミングパラダイムを正しく使用するのに役立つのか分かりません。 – ElmoVanKielmo

0

の結合に

  • ご注意ください。
    SpectrumSignalFrequency(など)は、「何百ものメソッド」よりはるかに少ない独立したクラスであることが明らかです。
    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の書式コードの慣習があります。

  • 関連する問題