Ошибка при распаковке python. AttributeError: объект 'Airthemati c' не имеет атрибута '__addition' - PullRequest
0 голосов
/ 03 августа 2020

Ниже приведен пример кода, я успешно обработал его, но при распаковке возникает ошибка. Любой, кто знает причину или решение, будет очень признателен.

sample.py

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 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

Вот код в juypter

from sample import Airthematic
a = Airthematic("+")
a.calculate(5, 6)
pd.to_pickle(a, "../output/sample.pickle") # Successful
aa = pd.read_pickle("../output/sample.pickle") # Giving error

    

AttributeError: 'Airthemati c 'объект не имеет атрибута' __addition '

Каким-то образом dict, который содержит отображение функций, дает ошибку.

1 Ответ

0 голосов
/ 05 августа 2020

Итак, как объяснил @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
...