gpt4 book ai didi

python - 在 python 中保存和加载类

转载 作者:行者123 更新时间:2023-11-30 23:26:34 26 4
gpt4 key购买 nike

我正在尝试使用 pickle 保存和加载一些类。在我的项目中,我有一些类,其中的变量包含其他类的列表和/或字典和/或元组。当我加载保存的类时,其中的类是不同的。我发现了一个关于静态方法 __new__ 的很棒的教程 here 。我编写了以下代码。当函数 load 执行时,我得到了 3 个类 1 的实例和类 2 的 2 个实例。为什么?

import pickle


def saveclass(obj):
f = file(obj.name, 'wb')
pickle.dump(obj, f, -1)
f.close()


def loadclass(name):
f = file(name, 'rb')
retclass = pickle.load(f)
f.close()
return retclass


class basicclass(object):

def __new__(cls, *args, **kw):
instances = cls.instances
obj = object.__new__(cls, *args, **kw)
if obj in instances:
return instances[instances.index(obj)]
else:
instances.append(obj)
return obj


class class1(basicclass):
instances = []

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


class class2(basicclass):
instances = []

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


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

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

print "Class1 instances"
for inst in c1.instances:
print inst.name, ':', inst

print "Class2 instances"
for inst in c2.instances:
print inst.name, ':', inst

print 'saving classes'
saveclass(c1)
saveclass(c2)


print 'Resetting classes'
c1 = None
c2 = None

print 'Reloading classes'

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


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

print "Class1 instances"
for inst in c1.instances:
print inst.name, ':', inst

print "Class2 instances"
for inst in c2.instances:
print inst.name, ':', inst

输出:

> class1 
> class2 has class1
> class2 's 'inside' class is c1: True
> Class1 instances
> class1 : <__main__.class1 object at 0xb7302a8c>
> Class2 instances
> class2 : <__main__.class2 object at 0xb7302a2c>
> saving classes
> Resetting classes
> Reloading classes
> class1
> class2 has class1
> class2 's 'inside' class is c1: False
> Class1 instances
> class1 : <__main__.class1 object at 0xb7302a8c>
> class1 : <__main__.class1 object at 0xb72fe10c>
> class1 : <__main__.class1 object at 0xb72fe1ac>
> Class2 instances
> class2 : <__main__.class2 object at 0xb7302a2c>
> class2 : <__main__.class2 object at 0xb72fe18c>

最佳答案

我想到了两种可能性:

  1. 您希望在 pickle 和取消 pickle 时保留身份。已经存在的类的对象有一个特殊的标识符。如果该对象已经存在,则在 unpickle 时会重复使用该对象。 Here is an example它使用 __new__ 来检查对象是否已经存在。您也可以将其与 json 一起使用。当对象的状态可变时就会出现问题。然后加载旧状态更新它们。

  2. 使用相同的序列化程序取消和 pickle 对象。不要只使用 dumpload,而是使用相同的 PicklerUnpickler

我认为这个问题应该已经在某个地方得到了回答。也许您还尝试使用“对象标识”“序列化”等进行搜索并附加找到的答案。

关于python - 在 python 中保存和加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22436353/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com