Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pickle链接对象第2部分_Python_Class_Pickle - Fatal编程技术网

Python Pickle链接对象第2部分

Python Pickle链接对象第2部分,python,class,pickle,Python,Class,Pickle,我试图做一些类似的事情,但我没有得到预期的结果。 这是我的密码 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')

我试图做一些类似的事情,但我没有得到预期的结果。 这是我的密码

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)
未勾选的对象不相同。我错过什么了吗


如果other类是其他类的列表,我应该做些不同的事情吗?

您需要在一个
pickle.dump
调用中pickle相关对象的整个“宇宙”,以便正确取消pickle

下面是一个版本的代码,可以实现这一点。(当然,
universe
可以是一个dict,而不是一个包含两个项目的列表,但你明白了。)

输出:

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
class1:
类别2:
类别2有类别1:
class2的“内部”类是c1:True
类别1:
类别2:
类别2有类别1:
class2的“内部”类是c1:True
什么是“未勾选的对象不一样”?加载前“在”class2内的类是名为“class1”的class1对象。加载类后,“内部”类2与加载的类1不同。
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