python – Pickle:AttributeError:’module’对象没有属性

我发现了很多关于这个问题的线索,但所有这些问题都是命名空间.我的问题与命名空间无关.

一个小例子:

import cPickle as pickle
from uncertainties import Variable

class value(Variable):
    def __init__(self, args, showing=False):
        self.show = showing
        Variable.__init__(self, args[0], args[1])

val = value((3,1), True)
print val.nominal_value, val.std_dev(), val.show
fobj = file("pickle.file", "w")
pickle.dump(val, fobj)
fobj.close()

fobj = file("pickle.file", "r")
val = pickle.load(fobj)
fobj.close()
print val.nominal_value, val.std_dev(), val.show

这段代码的输出:

3.0 1.0 True
3.0 1.0
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
    173             else:
    174                 filename = fname
--> 175             __builtin__.execfile(filename, *where)

/home/markus/pickle.py in <module>()
     19 val = pickle.load(fobj)
     20 fobj.close()
---> 21 print val.nominal_value, val.std_dev(), val.show

AttributeError: 'value' object has no attribute 'show'

酸洗和去斑纹时的命名空间是相同的.不确定性的所有属性.恢复变量 – 只有我添加的一个“节目”被遗漏.

解决方法:

uncertainties.Variable() class使用__slots__ attribute来节省内存.因此,要进行pickleable,它也必须定义__getstate__ method(见Why am I getting an error about my class defining __slots__ when trying to pickle an object?).

如果您需要添加自己的附加属性,则必须覆盖该__getstate__方法.在您自己的__slot__属性中声明其他属性也可能是一个好主意:

from uncertainties import Variable

class value(Variable):
    __slots__ = ('show',)  # only list *additional* slots

    def __init__(self, args, showing=False):
        self.show = showing
        super(value, self).__init__(args[0], args[1])

    def __getstate__(self):
        obj_slot_values = {}
        for cls in type(self).mro():
            obj_slot_values.update((k, getattr(self, k)) for k in getattr(cls, '__slots__', ()))
        # Conversion to a usual dictionary:
        return obj_slot_values

这个新的__getstate__是必需的,因为Variable .__ getstate__方法假设只有一个__slots__属性,而MRO中的每个类可能有一个.

这实际上是不确定性库的限制;我已经提交了一个解决这个问题的pull request,并且不再需要覆盖子类中的__getstate__方法.

上一篇:python – AttributeError:’list’对象没有属性’split’


下一篇:使用** kwargs设置属性时的Python3 AttributeError