Сейчас реализовал сабж примерно так:
class ApplicationInstance(Component, ComponentManager):
implements(ITemplateLoader, ITranslationProvider)
def __init__(self):
super(ApplicationInstance, self).__init__()
self.config = self.load_config()
self.load_components()
...
def load_config(self):
return config_factory()
Далее остальные компоненты имеют доступ к конфигу примерно следующим образом:
class Option(object):
'''Config option
'''
converter = lambda x:x
def __init__(self, section, name, default=None, doc=''):
self._section = section
self._name = name
self._default = default
self.__doc__ = doc
def __get__(self, instance, owner):
try:
return self.converter(instance.compmgr.config[self._section][self._name])
except AttributeError:
return self._default
def __set__(self, instance, value):
raise AttributeError, 'can\'t set attribute'
def __repr__(self):
return '<%s [%s] "%s">' % (self.__class__.__name__, self._section, self._name)
class IntOption(Option):
"""Descriptor for integer configuration options."""
converter = int
class SomeUsefulComponent(Component):
name = Option('main', 'name', doc='Name of component')
max_size = IntOption('main', 'max_buffer_size', 1024, 'Max size of buffer.')
def do_something(self):
print self.name
Передавать конфигурацию в конструктор модели я считаю несколько плохой идеей. Использовать некую глобальную переменную для конфига - тоже.
Собственно хотелось бы спросить совета, как реализовать правильное решение в данной ситуации.