2016-08-18 4 views
-5

Ich habe Klasse mit Hunderten von Methoden Ich möchte eine Hierarchie von ihnen erstellen, die leicht Methode finden lassen.Erstellen einer Hierarchie von Methoden in einer Klasse?

Zum Beispiel

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

Das möchte ich mit nennen:

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

Nein. Sie können das nicht tun. '.' bedeutet ein Zugriff auf das Attribut eines Objekts. Da Sie in 'MyClass' keine Objekte namens' Spectrum' und 'Signal' haben, können Sie dies nicht tun. – DeepSpace

+2

Was genau meinst du mit * "Ich möchte Hierarchie von ihnen erstellen, die leicht Methode [sic] finden lassen" *? Warum teilen Sie es nicht einfach in kleinere Objekte auf, die Sie beschreiben? – jonrsharpe

+1

Scheint so, als ob Sie die entsprechenden Teile der Methode in ein Objekt kapseln und dieses Objekt in 'MyClass.Spectrum' usw. setzen möchten. – khelwood

Antwort

0

Betrachten wir ein Wörterbuch mit Ihren Methoden, um Schlüssel zur Karte (‚‘ entweder hierarchischen Wörter oder einfach getrennt Tasten) .

Eine andere Option, die eleganter sein kann, ist namedtuples. Etwas wie:

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 
  • Sie können dies automatisieren, indem inspection mit und analysieren die Methodennamen durch, sagen Kamel Fall die namedtuples automatisch zu bauen.
  • Achten der Methoden zur Bindung
+0

Dies ist eindeutig ein Antipattern. – ElmoVanKielmo

+1

@ElmoVanKielmo Die Fragen beginnen zunächst mit einem Antipattern. Ich nehme an, dass er nicht nach jemandem gesucht hat, der ihm gesagt hat, dass er seinen Code umschreiben soll, oder? Er bat um eine programmatische Lösung. Ich habe keine Frage zur richtigen Softwareentwicklung beantwortet. Sie können gerne kommentieren, aber die Abstimmung ist übertrieben. Lösung ist nützlich, auch wenn Sie dem Leser nur eine Idee oder Richtung geben. – creativeChips

+0

http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem Tatsächlich beginnt die Frage von einem Antipattern. Das Problem X ist ein sehr schlechter Klassenentwurf. Lösung Y, nach der OP fragt, soll die Sprache hacken, um den Zugang zu Hunderten von Methoden zu erleichtern. Es muss klar gesagt werden, dass es nicht der richtige Weg ist. Während ich Ihr Wissen über Collections Modul und Methodenbindungen schätze, sehe ich nicht, wie es OP hilft, das objektorientierte Programmierparadigma korrekt zu verwenden. – ElmoVanKielmo

0

Dies ist nur ein sehr schlechtes Design.
Es ist klar, dass Spectrum, Signal, Frequency (und so weiter) sollten alle separaten Klassen mit viel weniger als "Hunderte von Methoden" sein.
Ich bin mir nicht sicher, ob MyClassObject tatsächlich etwas darstellt oder tatsächlich nur ein Namespace ist.
Objekte können Objekte anderer Klassen einkapseln. Zum Beispiel:

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() 

Es gibt eine Konvention von Code in Python Formatierung PEP 8 deshalb angewendet ich es in meinem Beispiel.

Verwandte Themen