В какой-то момент жизни программы создается объект testclass
, который затем сериализуется в файловой системе с использованием pickle
или h5py
.Теперь в течение этого периода определение testclass
обновляется.Обновление всегда касается добавления новых полей (а не удаления существующих).
Правильно ли десериализован сохраненный класс и ссылки на него с использованием обновленного определения testclass
?
До сериализации: Класс определен
class testclass:
__fieldA = None
__fieldB = None
__fieldC = 'Hello'
def __init__(self, A, B):
self.__fieldA = A
self.__fieldB = B
def setA(self, A):
self.__fieldA = A
def getA(self):
return self.__fieldA
def setB(self, B):
self.__fieldB = B
def getB(self):
return self.__fieldB
def setC(self, C):
self.__fieldC = C
def getC(self):
return self.__fieldC
>>>orig_obj = testclass('testA', 'testB')
>>>isinstance(orig_obj, testclass)
>>>True
>>>with open('test', 'wb') as handle:
pickle.dump(orig_obj, handle, protocol=pickle.HIGHEST_PROTOCOL)
После сериализации: Определение класса изменено
class testclass:
__fieldA = None
__fieldB = None
__fieldC = 'Hello'
__fieldD = 10
def __init__(self, A, B):
self.__fieldA = A
self.__fieldB = B
def setA(self, A):
self.__fieldA = A
def getA(self):
return self.__fieldA
def setB(self, B):
self.__fieldB = B
def getB(self):
return self.__fieldB
def setC(self, C):
self.__fieldC = C
def getC(self):
return self.__fieldC
def setD(self, D):
self.__fieldD = D
def getD(self):
return self.__fieldD
>>>with open('test', 'rb') as handle:
loaded_obj = pickle.load(handle)
>>>isinstance(loaded_obj, testclass)
>>>False
Теперь loaded_obj
не является экземпляром testclass
.Это имеет смысл и не имеет никакого отношения к тому, введено ли новое поле __fieldD
или нет.
В этом сценарии, каков наилучший способ убедиться, что loaded_obj
является экземпляром testclass