gpt4 book ai didi

python - Python 中的可序列化静态类变量

转载 作者:太空宇宙 更新时间:2023-11-03 11:00:15 25 4
gpt4 key购买 nike

在python中是否可以有可序列化的静态类变量或方法?举个例子,假设我有以下代码片段:

import pickle
class Sample:
count = 0 # class variable
def __init__(self, a1=0, a2=0):
self.a = a1
self.b = a2
Sample.count += 1

#MAIN
f = open("t1.dat", "wb")
d = dict()
for i in range(10):
s = Sample(i, i*i)
d[i] = s
pickle.dump(d,f)
print "Sample.count = " + str(Sample.count)
f.close()

输出是:

Sample.count = 10

现在,我有另一个类似于上面的阅读器程序:

import pickle
class Sample:
count = 0 # class variable
def __init__(self, a1=0, a2=0):
self.a = a1
self.b = a2
Sample.count += 1

#MAIN
f = open("t1.dat", "rb")
d = pickle.load(f)
print "Sample.count = " + str(Sample.count)

输出是:

Sample.count = 0

我的问题是:如何从我的文件中加载类变量?换句话说,我如何序列化一个类变量?如果直接不可能,还有其他选择吗?请建议。由于无法选择类变量,作为替代方案,我在读取文件时使用了主要部分的代码片段,如下所示:

#MAIN
f = open("t1.dat", "rb")
d = pickle.load(f)
Sample.count = len(d.values())
print "Sample.count = " + str(Sample.count)

现在的输出是:

Sample.count = 10

这是可以接受的解决方案吗?还有其他选择吗?

最佳答案

引用关于 "What can be pickled and unpickled?" 的部分

Similarly, classes are pickled by named reference, so the same restrictions in the unpickling environment apply. Note that none of the class’s code or data is pickled, so in the following example the class attribute attr is not restored in the unpickling environment:

class Foo:
attr = 'a class attr'

picklestring = pickle.dumps(Foo)

因为 attr,或者在你的例子中是 count,是类定义的一部分,所以它永远不会被 pickle。在您的“写入”示例中,您正在打印 Sample.count 确实存在但首先没有被腌制。

您可以在每个实例中将 Sample.count 存储为 _count 并放置 Sample.count = self._count。但请记住,由于您的 d 是一个 dict,它们可能会以任何顺序解开。所以本质上这是行不通的。

您需要添加 __setstate__为您的类(class)定制它腌制的方式并放入一些标志值(如 _count),然后您在 __getstate__. 中操作(通过任何一致工作的逻辑) (编辑:除非您将 count 存储在全局变量中并在 getstate 中访问它,并在每次取消对象时进一步操作,否则对给定的问题没有帮助。)

另一个可能的解决方法,但讨厌:向您的 dict d 添加一个变量,以便它也被腌制。当您读回它时,使用 Sample.count = d['_count'] 恢复。所以在 pickle.dump(d,f) 之前,当你 pickle 时,做 d['_count'] = Sample.count

重要警告:这实际上不允许您腌制 Sample.count,因为您实际腌制的 (d) 是 Sample< 的字典s.

编辑:Sample.count = len(d.values()) 您作为变通方法放置的是非常特定您的用例而不是general 中的类属性。

关于python - Python 中的可序列化静态类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34351669/

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