尝试取消腌制的QObject
(使用Python 2.7,PyQt4或5,pickle或cPickle),引发以下RuntimeError
:
RuntimeError: super-class __init__() of type QObject was never called
一个最小的例子:
cPickle.loads(cPickle.dumps(QtCore.QObject(), cPickle.HIGHEST_PROTOCOL))
我知道按设计拆除对象不会调用对象的__init__()
方法。
那么,在这种情况下,如何确保调用超类__init__()
?
一个看似相似的问题被问到here,但没有回答。
答案 0 :(得分:1)
基于this answer的一种可能的解决方案可以实现如下(一个稍微复杂的示例,带有自定义属性):
import cPickle
from PyQt5 import QtCore
class MyQObject(QtCore.QObject):
def __init__(self, parent=None):
super(MyQObject, self).__init__(parent)
# Add some custom attribute
self.some_attribute = 'something'
def __setstate__(self, state):
# Restore attributes
self.__dict__.update(state)
# Call the superclass __init__()
super(MyQObject, self).__init__()
original = MyQObject()
pickle_string = cPickle.dumps(original, cPickle.HIGHEST_PROTOCOL)
restored = cPickle.loads(pickle_string)
如有必要,可以使用setParent()
设置父级。