编写此代码:
>>> class T:
>>> version = '1.0'
>>> import pickle
>>> pickled = pickle.dumps(T)
>>> T.version = '2.0'
>>> PT = pickle.loads(pickled)
>>> PT.version
>>> '2.0'为什么会发生这种事?难道PT.version == '1.0‘不应该像腌制时那样吗?另一方面,我看到
>>> T
<class '__main__.T'>
>>> PT
<class '__main__.T'>
>>> id(PT) == id(T)
True python类对象(不是类实例,类对象本身)是单例还是类似的?我希望现在会有两个不同的类,但似乎只有一个类,以及两个不同的别名、引用或名称。
发布于 2021-12-03 09:54:35
函数和类本质上都是作为对全局变量的引用而进行的,注意,这就是为什么不能对lambda进行分类,或者不能在顶层定义的类和函数。来自文档
请注意,函数(内置和用户定义的)是由“完全限定”的名称引用(而不是按值)选择的。这意味着只对函数名进行了筛选,以及函数在其中定义的模块的名称。函数的代码和它的任何函数属性都不会被腌制。因此,定义模块必须在解酸洗环境中被导入,并且模块必须包含命名对象,否则会引发异常。3. 类似地,类是通过命名引用对其进行筛选的,因此在非泡沫化环境中也应用了相同的限制。请注意,类的任何代码或数据都不会被酸洗。
注意,文档还提供了一个关于如何为类对象重写此行为的示例:
import io
import pickle
class MyClass:
my_attribute = 1
class MyPickler(pickle.Pickler):
def reducer_override(self, obj):
"""Custom reducer for MyClass."""
if getattr(obj, "__name__", None) == "MyClass":
return type, (obj.__name__, obj.__bases__,
{'my_attribute': obj.my_attribute})
else:
# For any other object, fallback to usual reduction
return NotImplemented
f = io.BytesIO()
p = MyPickler(f)
p.dump(MyClass)
del MyClass
unpickled_class = pickle.loads(f.getvalue())
assert isinstance(unpickled_class, type)
assert unpickled_class.__name__ == "MyClass"
assert unpickled_class.my_attribute == 1https://stackoverflow.com/questions/70212138
复制相似问题