Определенная ситуация в 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 "<pyshell#74>", line 1, in <module>
class D(B, C): __slots__ = ()
TypeError: multiple bases have instance lay-out conflict
Однако в этом примере возникает TypeError
. Итак, возникает три вопроса: (1) Это ошибка в Python, учитывая имена слотов? (2) Что оправдывает такой ответ? (3) Какой лучший обходной путь?
Рекомендации: