Я работаю над проектом, основной руководящий принцип дизайна которого является расширяемостью.
Я реализовал сменную систему путем определения метакласса, которые регистрируются - в методе класса - имя класса любого плагина, который загружается (каждый тип плагина наследовались определенному классу, определенному в базовом коде, поскольку существуют различные типы плагинов в приложении). В основном это означает, что разработчик должен будет определить свой класс как
class PieChart(ChartPluginAncestor):
# Duck typing:
# Implement compulsory methods for Plugins
# extending Chart functionality
и основная программа будет знать о его присутствии потому что PieChart
будет включен в список зарегистрированных плагинов, доступных в ChartPluginAncestor.plugins
.
Будучи способом монтажа, метод класса, все плагины регистрируются, когда их код класса загружается в память (поэтому даже, прежде чем объект того класса инстанцируют).
Система работает хороший enough™ на меня (хотя я всегда открыт для предложений о том, как улучшить архитектуру!), но я теперь задаюсь вопросом, что было бы лучшим способом управлять сменными файлами (т.е. где и как файлы, содержащие плагины, должны храниться).
До сих пор я использую - для разработки целей - пакет, что я назвал "плагины". Я поместил все свои *.py файлы, содержащие классы плагинов в каталоге пакета, и я просто выхожу import plugins
в main.py файле, чтобы все плагины были смонтированы правильно.
Править: Jeff указал в комментариях на это import plugins
классы, содержавшиеся в различных модулях пакетов, не будут легко доступны (я не понял это, как я был - для отладки целей - импортирующий каждый класс отдельно с from plugins.myAI import AI
).
Однако эта система только хороша, в то время как я разрабатываю и тестирую код, как:
/usr/local/bin/
) и определенный для пользователя (например, где-нибудь под /home/<user>/.myprogram/
).Таким образом, мои вопросы действительно - возможно - три: