Вызов метода в экземпляре, который реализует вызывающий класс, но в остальном не связан

#python #class #methods

#python #класс #методы

Вопрос:

Допустим, у меня есть такая файловая структура:

  • проект
    • графический интерфейс пользователя
      • gui.py
      • виджеты
        • base_widg.py
    • midi
      • main.py

main.py содержит класс с именем Engine и метод внутри него, называемый midi_out

base_widg.py содержит класс с именем BaseWidg

gui.py это файл, который я запускаю, когда хочу протестировать всю программу, и реализует как экземпляр класса Engine в main.py и экземпляр класса BaseWidg в base_widg.py

Внутри BaseWidg есть метод, который должен вызывать функцию midi_out в реализованном экземпляре Engine

Редактировать

в функции инициализации Engine:

 self.midiout = rtmidi.MidiOut()
  

Это важно, потому что многие другие методы нуждаются в этом объявлении, включая midi_out, потому что:

 def midi_out(self, note, vel, state):
    # figure out what channel is (irrelevant)
    self.midiout.send_message([channel, note, vel)
  

К сожалению, это наводит меня на мысль, что я не могу использовать @staticmethod …

Какой самый питонический и эффективный способ сделать это? Нужно ли мне изменять структуру моей программы?

Потенциально не имеет значения: я использую python 2.7, pygtk 2 и python_rtmidi.

Комментарии:

1. Использование staticmethod в определении midi_out. И используйте механизм операторов.midi_out() внутри BaseWidg

2. По какой-то причине я забыл упомянуть кое-что действительно важное…

Ответ №1:

Один из вариантов — заставить конструктор BaseWidg взять экземпляр Engine и сохранить его как переменную экземпляра. Затем вы можете просто вызвать midi_out() метод этого экземпляра Engine из BaseWidg.

Комментарии:

1. Это определенно один из вариантов. Я надеялся, что у python может быть что-то необычное в рукаве, но я сделаю то, что работает сейчас, спасибо за вашу помощь!

2. Np. Этот подход на самом деле довольно часто используется. Это своего рода инверсия зависимостей , называемая внедрением зависимостей .

3. Так что это действительно лучший, самый питонический способ сделать это? Отлично! Спасибо!