Недавно меня встревожила одна ситуация в Python, и ее причина до сих пор не полностью ясна после небольшого исследования. Следующие определения классов работают безукоризненно и дают то, что задумано:
class A: __slots__ = 'a', 'b'
class B(A): __slots__ = ()
class C(A): __slots__ = ()
class D(B, C): __slots__ = ()
Это четыре класса, организованные в виде ромба наследования. Однако несколько похожий рисунок не допускается. Следующие определения класса должны функционировать так же, как и первое:
class B: __slots__ = 'a', 'b'
class C: __slots__ = 'a', 'b'
class D(B, C): __slots__ = ()
Traceback (most recent call last):
File "", line 1, in
class D(B, C): __slots__ = ()
TypeError: multiple bases have instance lay-out conflict
Однако в этом примере возникает ошибка TypeError
. Таким образом, возникают три вопроса: (1) Является ли это ошибкой в Python, учитывая имена слотов? (2) Чем можно оправдать такой ответ? (3) Каков наилучший обходной путь?
Ссылки: