2014-03-26 5 views
1

나는 this과 비슷한 것을하려고하지만 기대했던 결과를 얻지 못한다. 내 코드는 다음과 같습니다Pickle linked objects part 2

import pickle 


def saveclass(objects): 
    f = file(objects[0].name, 'wb') 
    for obj in objects: 
     p = pickle.Pickler(f) 
     p.dump(obj) 
    f.close() 


def loadclass(name, size): 
    f = file(name, 'rb') 
    objlist = [] 
    p = pickle.Unpickler(f) 
    for obj in range(size): 
     objlist.append(p.load()) 
    f.close() 
    return objlist 


class class1(object): 

    def __init__(self, name): 
     self.name = name 


class class2(object): 

    def __init__(self, name, otherclass): 
     self.name = name 
     self.otherclass = otherclass 

c1 = class1("class1") 
c2 = class2("class2", c1) 

print c1.name, ':', c1 
print c2.name, ':', c2 

print c2.name, 'has', c2.otherclass.name, ':',\ 
c2.otherclass 
print c2.name, "'s 'inside' class is c1:", c2.otherclass == c1 

print 'saving classes' 
saveclass([c1, c2]) 


print 'Reloading classes' 

clist = loadclass("class1", 2) 

c1 = clist[0] 
c2 = clist[1] 

print c1.name, ':', c1 
print c2.name, ':', c2 

print c2.name, 'has', c2.otherclass.name, ':', c2.otherclass 
print c2.name, "'s 'inside' class is c1:", c2.otherclass == c1 
print id(c2.otherclass) == id(c1) 

언 피클 된 개체가 동일하지 않습니다. 내가 놓친 게 있니?

다른 클래스가 다른 클래스의 목록 인 경우 다른 조치를 취해야합니까?

+0

당신은 unpickled 객체가 동일하지 않습니다 "의미합니까 "? – laike9m

+0

로드 전의 클래스 "inside"class2는 "class1"이라는 이름의 class1 객체입니다. "inside"클래스를로드 한 후에 class2는로드 된 클래스 1과 다릅니다. – Yannis

답변

1

pickle.dump 호출에서 관련 개체의 전체 "유니버스"를 피클 할 필요가 있습니다.

다음은이 작업을 수행하는 코드의 버전입니다. (물론 universe 대신 두 항목 목록의 딕셔너리 될 수있다, 그러나 당신은 점을 얻는다.)

import pickle 

class class1(object): 
    def __init__(self, name): 
     self.name = name 

class class2(object): 
    def __init__(self, name, otherclass): 
     self.name = name 
     self.otherclass = otherclass 

def test(c1, c2): 
    print c1.name, ':', c1 
    print c2.name, ':', c2 

    print c2.name, 'has', c2.otherclass.name, ':', c2.otherclass 
    print c2.name, "'s 'inside' class is c1:", (c2.otherclass is c1) 

c1 = class1("class1") 
c2 = class2("class2", c1) 

test(c1, c2) 
universe = [c1, c2] 
pickled_universe = pickle.dumps(universe) 
c1, c2 = pickle.loads(pickled_universe) 
test(c1, c2) 

출력 :

class1 : <__main__.class1 object at 0x01F6A830> 
class2 : <__main__.class2 object at 0x01F6A870> 
class2 has class1 : <__main__.class1 object at 0x01F6A830> 
class2 's 'inside' class is c1: True 
class1 : <__main__.class1 object at 0x01F6A8B0> 
class2 : <__main__.class2 object at 0x01F71230> 
class2 has class1 : <__main__.class1 object at 0x01F6A8B0> 
class2 's 'inside' class is c1: True 
+0

감사합니다. 훌륭하게 작동합니다. – Yannis