#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. Спасибо, так оно и было. Способ обработки слотов в производном классе несколько скрыт в документации, поэтому я его не нашел.