Читайте `zope.component` и `zope.interface` это интересно ;-). И ещё `zope.annotation` может пригодиться. Посмотрите последний пакет, в купе с `zope.interface.classImplements(Service, zope.annotation.IAttributeAnnotatable)`, если `Service` не ваш.
Ещё можно запилить `ServiceAdapter.__new__` с `weakref` ссылкой (или без :-) на `Service()`. Так же, адаптер не обязан быть классом, это может быть любая функция или метод. Можете создать функцию (ниже пара примеров), которая по неким атрибутам либо создаёт, либо возвращает созданный экземпляр `ServiceAdapter`. То же самое можно проделать с методом класса, что бы не гадить в глобальном пространстве:
# ...
@zope.component.adapter(Service)
@zope.interface.implementer(IService)
def myadapter(svc):
if not svc in myglobaldict:
myglobaldict[svc] = ServiceAdapter(svc)
return myglobaldict[svc]
#twisted.python.components.registerAdapter(myadapter, Service)
# или
#zope.component.provideAdapter(myadapter)
# а лучше
zope.component.getSiteManager()\
.registerAdapter(myadapter)
# ...
# ...
class ServiceAdapterProvider(object):
def __init__(self):
self.mydict = {}
twisted.python.components.registerAdapter(self.adapter, Service, IService)
def adapter(self, svc):
if not svc in self.mydict:
self.mydict[svc] = ServiceAdapter(svc)
return self.mydict[svc]
# ...
В общем суть одна, реализаций может быть сколь угодно.
ZCA это не изобретение Twisted, так что пользуйтесь первоисточниками, ну и посматривайте, чего там в `twisted.python.components` начудили.
Да, забыл самое главное сказать, исходники открыты и их можно почитать, если возникают вопросы :-).
..bw