Редактировать: следуйте совету @ Тобу, не делай этого.Мой ответ ниже неправильный, но оставлен на месте для полноты картины.Это неверно, потому что перемешивание метакласса zope.interface.implements еще не обработало информацию об интерфейсе.
Я думаю, что подход, безусловно, вменяемый.Вам не нужно передавать предоставленный интерфейс или адаптированные спецификации для предоставления адаптера, метод регистрации определит их, если реализован только один интерфейс:
class MetaclassAdapter(type):
def __init__(cls, clsname, bases, attrs):
super(MetaclassAdapter, cls).__init__(clsname, bases, attrs)
component.provideAdapter(cls)
Если вы хотите поддерживать классы, которыеДля реализации более чем одного интерфейса (путем прямого объявления или наследования) вам придется придумать семантику, чтобы определить, какой интерфейс будет выбран в качестве целевого интерфейса адаптера.
В этом случае просто передайте выбранный интерфейс для registerAdapter с помощью параметра provide = keyword.Я бы посоветовал вам использовать API интроспекции zope.interface (zope.interfaces.implementedBy), чтобы найти предоставленные интерфейсы, а не напрямую извлекать их из внутренних структур данных в классе.