Я выбрал экземпляр класса, производного от ndarray, но потерял атрибуты во время засолки / расслоения.Ниже приведен упрощенный код для иллюстрации проблемы.Я не понимаю:
- Почему «attrib» не включен в дамп / загрузку рассола?Что мне нужно сделать, чтобы он был включен?
- Почему __getstate __ () не вызывается во время дампа, чтобы я мог добавить отсутствующий "atrrib"?__setstate __ () был вызван.Как было установлено государство?Я думал, что я добавлю «attrib» к полученному состоянию, чтобы позже его можно было установить.
import numpy as np
import pickle
class Xndarray(np.ndarray):
def __new__(cls, **kwargs):
return super().__new__(cls, (5, 3), **kwargs)
def __init__(self, **kwargs):
self[...] = -1
self.attrib = 0
def add2getstate(self):
print("add2getstate()", self.__dict__)
def __getstate__(self): # This never gets called
print("__getstate__()")
return super().__getstate__()
def __setstate__(self, data):
print("__setstate__()")
super().__setstate__(data)
if __name__ == "__main__":
fname = "fname.pkl"
x = Xndarray()
x[0] = 0
x.attrib += 2
print(x)
x.add2getstate()
print(x.attrib)
with open(fname, "wb") as fh:
pickle.dump(x, fh)
print("---------------")
with open(fname, "rb") as fh:
y = pickle.load(fh)
print(y)
y.add2getstate()
print(y.attrib)
Вот вывод:
[[ 0. 0. 0.]
[-1. -1. -1.]
[-1. -1. -1.]
[-1. -1. -1.]
[-1. -1. -1.]]
add2getstate() {'attrib': 2}
2
---------------
__setstate__()
[[ 0. 0. 0.]
[-1. -1. -1.]
[-1. -1. -1.]
[-1. -1. -1.]
[-1. -1. -1.]]
add2getstate() {}
Traceback (most recent call last):
File "./t.py", line 48, in <module>
print(y.attrib)
AttributeError: 'Xndarray' object has no attribute 'attrib'