Атрибут объекта Python — это другой объект, который не будет загружаться с помощью pickle.load(). Что я делаю не так?

У меня есть объект:

class X():
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

чей атрибут c, является объектом списка (другого вида):

class Y():
    def __init__(self, x, y):
        self.x = x
        self.y = y

Я мариную так:

import pickle
pickle.dump(instance_of_class_X,open(dir, "wb"))

Загружаю следующим образом:

import pickle
from some_library import X, Y # I import the two classes involved
pickle.load(open(dir,"rb"))

Я получаю следующую ошибку:

AttributeError: объект «модуль» не имеет атрибута «Y»

Не уверен, что делать, любая помощь будет высоко оценена.


person killajoule    schedule 10.06.2012    source источник
comment
где возникает исключение?   -  person wroniasty    schedule 10.06.2012


Ответы (1)


Возможно, вы становитесь жертвой необходимости pickle иметь доступ к классу через то же полное имя, которое использовалось изначально. Это будет зависеть от того, в каком пространстве имен X и Y находятся при первоначальном создании объекта. См. этот ответ и эта страница.

person BrenBarn    schedule 10.06.2012
comment
Я думаю, вы правы. У меня был класс X в файле Python, который я запускал, а класс Y находился внутри функции, которую я импортировал из библиотеки (я сделал это для организации). Я скопировал и вставил функцию, которую я импортировал, в файл Python, который я запускал, а затем вытащил класс (Y) из функции, чтобы он был таким же, как мой другой класс X. Теперь это работает. Мой код намного грязнее, но теперь он работает. Не знал об этой тонкости в Python. Спасибо друг :) - person killajoule; 10.06.2012