2010-09-01 25 views
13

Tôi đang cố gắng chọn một thể hiện của một lớp trong một mô-đun và bỏ chọn nó trong một mô-đun khác.Thuộc tínhLỗi khi bỏ ghim đối tượng

Dưới đây là nơi tôi dưa:

import cPickle 

def pickleObject(): 
    object = Foo() 
    savefile = open('path/to/file', 'w') 
    cPickle.dump(object, savefile, cPickle.HIGHEST_PROTOCOL) 


class Foo(object): 
    (...) 

và đây là nơi mà tôi cố gắng unpickle:

savefile = open('path/to/file', 'r') 
object = cPickle.load(savefile) 

On rằng dòng thứ hai, tôi nhận được AttributeError: 'module' object has no attribute 'Foo'

Bất cứ ai nhìn thấy những gì tôi đang làm sai rồi?

Trả lời

17

class Foo phải có thể nhập được qua cùng một đường dẫn trong môi trường chưa được giải quyết sao cho đối tượng được chọn có thể được khôi phục.

Tôi nghĩ rằng vấn đề của bạn là bạn xác định Foo trong mô-đun mà bạn đang thực hiện là chính (__name__ == "__main__"). Pickle sẽ tuần tự hóa đường dẫn (không phải đối tượng lớp/định nghĩa !!!) thành Foo như trong mô-đun chính. Foo không phải là thuộc tính của tập lệnh bỏ ghim chính.

Trong ví dụ này, bạn có thể xác định lại class Foo trong tập lệnh bỏ ghim và nó sẽ không được sử dụng tốt. Nhưng ý định thực sự là có một thư viện chung được chia sẻ giữa hai tập lệnh sẽ có sẵn theo cùng một đường dẫn. Ví dụ: define Foo trong foo.py

Ví dụ đơn giản:

$ PROJECT_DIR/foo.py

class Foo(object): 
    pass 

$ PROJECT_DIR/picklefoo.py

import cPickle 
from foo import Foo 

def pickleObject(): 
    obj = Foo() 
    savefile = open('pickle.txt', 'w') 
    cPickle.dump(obj, savefile, cPickle.HIGHEST_PROTOCOL) 


pickleObject() 

$ PROJECT_DIR/unpicklefoo.py

import cPickle 

savefile = open('pickle.txt', 'r') 
obj = cPickle.load(savefile) 
... 
+0

Điều đó đã xảy ra. Cảm ơn sự giúp đỡ của các bạn. – Max

3

Jeremy Brown đã có câu trả lời đúng, đây là một phiên bản cụ thể hơn của cùng một điểm:

import cPickle 
import myFooDefiningModule 
def pickleObject(): 
    object = myFooDefiningModule.Foo() 
    savefile = open('path/to/file', 'w') 
    cPickle.dump(object, savefile) 

và:

import cPickle 
import myFooDefiningModule 
savefile = open('path/to/file', 'r') 
object = cPickle.load(savefile) 

Foo cuộc sống trong không gian tên tương tự trong mỗi đoạn mã.

Các vấn đề liên quan