我有一个类,它是线程之间使用的支持接口。
由于它的性质,我不得不定制__getstate__和__setstate__。该类有一个UniqueCounter来帮助为所述接口创建唯一的id。但是,该类也使用__slots__来限制开销(可以创建许多此类(
该类如下所示:
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__值。但是,我的独特计数器没有得到更新,这是有道理的,因为它不是**__slots__的一部分。(我不确定我的独特计数器是否打破了__slots__的优势(。
现在我尝试将该变量打包到__getstate__方法中的returnValue中。但是,如果我尝试直接在__setstate__设置它,我会得到一个"映射代理"对象不支持项目分配错误。 我也不能使用 setattr 添加它,因为该属性是只读的。
有什么想法吗?我应该停止使用插槽(如果可行,我还没有尝试过(,但如果可能的话,我想坚持使用**__slots__。
如果我更改两种方法__getstate__和__setstate__
如下所示# ---------------------------------------------------------------------------------------------------------------------
def __getstate__(self):
self.RmQueue()
self._Serialized = True
returnValue = {slot: getattr(self, slot) for slot in self.__slots__ if hasattr(self, slot)}
returnValue['ClassVariables'] = {'UniqueCounter': type(self).UniqueCounter}
return returnValue
# ---------------------------------------------------------------------------------------------------------------------
def __setstate__(self, stat):
for slot, value in stat.items():
if slot == 'ClassVariables':
for ClassVariableName, ClassValue in value.items():
if ClassVariableName == 'UniqueCounter':
self.SetUniqueCounter(ClassValue)
else:
setattr(self, slot, value)
并添加方法
# -------------------------------------------------------------------------------------------------------------------------------------------------------------
def SetUniqueCounter(self, val):
type(self).UniqueCounter = val
我没有收到错误"映射代理"对象不支持项目分配,现在可以设置我的唯一计数器。
但是我不明白为什么这是合法的,而直接转让不是。如果有人能为我澄清这一点,我会很高兴。但是上述工作有效,我在序列化后设置了我的类变量。