#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. Так что это действительно лучший, самый питонический способ сделать это? Отлично! Спасибо!