Наследовать класс со слабой ссылкой в слотах

#python #inheritance #weak-references

#python #наследование #слабые ссылки

Вопрос:

Я пытался использовать слабые ссылки в своих классах, где я использую слоты для экономии памяти, но я не смог создать производный класс.

 class A(object):
    __slots__ = ['__weakref__']

class B(A):
    __slots__ = A.__slots__   ['foo']
#TypeError: Error when calling the metaclass bases
#    __weakref__ slot disallowed: either we already got one, or __itemsize__ != 0
 

В чем хитрость? Я не нашел никакого решения. Я использую python 2.7.3.

Ответ №1:

В производные классы не следует помещать слоты, которые были определены в базовых классах.

На самом деле ошибка гласит:

TypeError : Ошибка при вызове базового __weakref__ слота метакласса запрещена: либо он у нас уже есть, либо __itemsize__ != 0

Просто используйте:

 class B(A):
    __slots__ = ['foo']
 

Это объясняется в документации для __slots__ :

Действие __slots__ объявления ограничено классом, в котором оно определено. В результате подклассы будут иметь __dict__ , если они также не определяют __slots__ (которые должны содержать только имена любых дополнительных слотов).

Комментарии:

1. Спасибо, так оно и было. Способ обработки слотов в производном классе несколько скрыт в документации, поэтому я его не нашел.