2016-08-18 4 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», это невозможно. – DeepSpace

+2

Что именно вы подразумеваете под * «Я хочу создать иерархию из них, что позволит легко найти метод [sic]" *? Почему бы вам просто не разделить его на более мелкие объекты вдоль линий, которые вы описываете? – 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 для начала. Я полагаю, он не искал, чтобы кто-то сказал ему переписать его код, верно? Он попросил о программном решении. Я не ответил на вопрос о правильной разработке программного обеспечения. Вы можете прокомментировать, но downvoting является чрезмерным. Решение полезно, даже если вы просто даете идею или направление читателю. – creativeChips

+0

http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem Действительно вопрос начинается с антипаттерна. Проблема X - очень плохой дизайн класса. Решение 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 поэтому я применил его в моем примере.

Смежные вопросы