在python中取消勾选时出错。AttributeError:'Airthematic'对象没有属性'\u'

2024-10-01 17:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是示例代码,我成功地对其进行了pickle,但取消pickle会给出一个错误。任何知道原因或解决方案的人都会非常感激

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:'Airthematic'对象没有属性'\u'

不知怎的,包含函数映射的dict给出了一个错误


Tags: sample代码importselfnonereturndef错误
1条回答
网友
1楼 · 发布于 2024-10-01 17:30:51

正如@IainShelvington所解释的,私有属性和函数名是不同的。所以在我泡菜之后,我在记事本中打开文件并观察它。我发现私有属性名保存为_Airthematic_uuuux、_Airthematic_uuy等等。但是函数名并不是存储为属性映射的乘法。另外,我在阅读@ewong共享的文档后注意到函数名没有保存在pickle文件中。因此,当取消勾选时,它将发现名为_乘法的属性,该属性不存在于pickle文件中,因为函数名未存储。所以我找到了解决方案,必须实现“\uuuu getstate\uuuuuuuuuu”和“\uuuuu setstate\uuuuuuuuuu”函数。以下是修订版,可以正常工作

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

相关问题 更多 >

    热门问题