Пытаюсь реализовать сериализацию и десериализацию виджета PyQt с помощью модуля pickle. Добавил спец. методы для сериализации.
На данный момент такой код:
import pickle, sys from PyQt4 import QtGui class MyWindow(QtGui.QWidget): """Окно""" def __new__(cls, args=None): """Метод new""" obj = super(MyWindow, cls).__new__(cls) return obj def __init__(self): """Метод init""" QtGui.QWidget.__init__(self) self.setWindowTitle("Тест") def __getstate__(self): return self.windowTitle() def __setstate__(self, value): self.setWindowTitle(value) def __getinitargs__(self): flag = True return (flag, ) #Создаем экземпляр приложение app = QtGui.QApplication(sys.argv) #Создаем эксземпляр класса MainWindow obj = MyWindow() #Сохрание with open(r'TestFile.txt', 'wb') as f: pickle.dump(obj, f, 3) #востановление with open(r'TestFile.txt', 'rb') as f: obj = pickle.load(f) #Показываем окно obj.show() #Запускаем цикл обработки событий sys.exit(app.exec_())
Выдает ошибку “super-class __init__ of <__main.MyWindow object …> was never called”.
Как я понимаю, pickle не вызывает __init__? В тоже время __new__ срабатывает. Можно ли из __new__ принудительно вызвать __init__? И как правильно это сделать? Или в pickle как-то указать, что объект требует инициализации.