Python3 如何使用 __slots__ 序列化类中的类变量



我有一个类,它是线程之间使用的支持接口。

由于它的性质,我不得不定制__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

我没有收到错误"映射代理"对象不支持项目分配,现在可以设置我的唯一计数器。

但是我不明白为什么这是合法的,而直接转让不是。如果有人能为我澄清这一点,我会很高兴。但是上述工作有效,我在序列化后设置了我的类变量。

相关内容

  • 没有找到相关文章

最新更新