Я пытаюсь создать класс Abstract Mixin для библиотеки Qt, над которой я работаю. Мой миксин будет работать только с подклассами QBoxLayout, но не с его родительским классом QLayout.
from abc import ABCMeta
# In Qt
class QLayout:
...
# In Qt
class QBoxLayout(QLayout):
...
class AbstractLayoutMixin(QBoxLayout, metaclass=ABCMeta):
...
class BrokenLayout(QLayout, AbstractLayoutMixin):
...
broken_layout = BrokenLayout()
Если разработчик наивно или случайно использует мой Mixin с QLayout вместо QBoxLayout, я хотел бы напечатать более описательную ошибку, чем
Traceback (most recent call last):
File "/home/user/name.py", line 14, in <module>
class BrokenLayout(QLayout, AbstractLayoutMixin):
File "/home/user/.virtualenvs/bf/lib/python3.6/abc.py", line 133, in __new__
cls = super().__new__(mcls, name, bases, namespace, **kwargs)
TypeError: Cannot create a consistent method resolution
order (MRO) for bases QLayout, AbstractLayoutMixin
Возможно ли лучше справиться с этим исключением? Моим первым инстинктом было попытаться определить AbstractLayoutMixin.__new__
и, возможно, сделать что-то там, но сначала вызывается ABCMeta.__new__
без его использования.