У меня есть класс, который является интерфейсом поддержки, используемым между потоками.
В силу своей природы мне пришлось создать пользовательские __ getstate __ и __ setstate __ .У класса есть UniqueCounter, чтобы помочь создать уникальные идентификаторы для указанного интерфейса.Однако класс также использует ___ слотов __ для ограничения накладных расходов (многие могут быть созданы из указанного класса)
Класс выглядит следующим образом:
class WriterIf(object):
UniqueCounter = 0
__slots__ = [
'_UpdateQueue',
'WriterIfId',
'_weakWriterPtr',
'_MasterIf',
'_TestName',
'_TestCaseName',
'_GroupeName',
'_TestStatus',
'_Serialized',
]
def __init__(self, WriterMQ, MasterIf : bool = False):
self._UpdateQueue = WriterMQ
self.WriterIfId = self.UniqueCounter
self._GroupeName = None
self._TestCaseName = None
self._TestName = None
self._TestStatus = self.T_STATUS_NA
self._Serialized = False
type(self).UniqueCounter += 1
if MasterIf:
self.WriterIfId = -1
self._MasterIf = MasterIf
# ---------------------------------------------------------------------------------------------------------------------
def __getstate__(self):
self.RmQueue()
self._Serialized = True
returnValue = {slot: getattr(self, slot) for slot in self.__slots__ if hasattr(self, slot)}
return returnValue
# ---------------------------------------------------------------------------------------------------------------------
def __setstate__(self, stat):
for slot, value in stat.items():
setattr(self, slot, value)
Это работает так, как оноследует, сериализуя мои слоты и восстанавливая мои значения __ slots__.Однако мой UniqueCounter не обновляется, что имеет смысл, поскольку он не является частью ** ___ слотов __ .(На самом деле я не уверен, что мой UniqueCounter нарушает преимущество __ слотов __ ).
Теперь я попытался упаковать эту переменную в мое returnValue в __ getstate__ метод.Однако, если я пытаюсь установить его непосредственно на __ setstate __ , я получаю объект 'mappingproxy', не поддерживающий назначение элемента ошибка.Я не могу добавить его с помощью setattr, потому что атрибут только для чтения.
Есть идеи ?.Должен ли я прекратить использование слотов (я еще не пробовал, если это работает), но я хотел бы придерживаться ** __ slots__, если это возможно.