Итак, как объяснил @IainShelvington, частные атрибуты и имена функций отличаются. Итак, после того, как я мариновал, я открыл файл в блокноте и посмотрел на него. Я обнаружил, что имена частных атрибутов сохраняются как _Airthematic__x, _Airthematic__y и так далее. Но имена функций не сохраняются, поскольку они хранятся как __multiplication для атрибута _Airthematic__function_mapping. Кроме того, после прочтения документов, опубликованных @ewong, я заметил, что имена функций не сохраняются в файле pickle. Таким образом, при распаковке он найдет атрибут с именем __multiplication, которого нет в файле pickle, поскольку имя функции не сохраняется. Итак, я нашел решение, в котором необходимо реализовать функции «__getstate__» и «__setstate__». Ниже приведена исправленная версия, которая будет работать нормально.
import pandas as pd
class Airthematic(object):
def __init__(self, symbol):
self.symbol_ = symbol
self.__x = None
self.__y = None
self.__result = None
self.__function_mapping = {
"+": self.__addition,
"-": self.__subtraction,
"*": self.__multiplication
}
def __getstate__(self):
state = self.__dict__.copy()
# Remove the unpicklable entries.
del state["_" + str(self.__class__.__name__) + '__function_mapping']
return state
def __setstate__(self, state):
# Restore instance attributes (i.e., function_mapping).
self.__dict__.update(state)
self.__function_mapping = {
"+": self.__addition,
"-": self.__subtraction,
"*": self.__multiplication
}
def calculate(self, x, y):
self.__x = x
self.__y = y
self.__result = self.__function_mapping[self.symbol_]()
def __addition(self):
return self.__x+self.__y
def __subtraction(self):
return self.__x-self.__y
def __multiplication(self):
return self.__x*self.__y
@property
def first_number_(self):
return self.__x
@property
def second_number_(self):
return self.__y
@property
def result_(self):
return self.__result