首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泡菜模块似乎在观察原始对象。

泡菜模块似乎在观察原始对象。
EN

Stack Overflow用户
提问于 2021-12-03 09:34:28
回答 1查看 62关注 0票数 1

编写此代码:

代码语言:javascript
复制
>>> 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‘不应该像腌制时那样吗?另一方面,我看到

代码语言:javascript
复制
 >>> T
 <class '__main__.T'>
 >>> PT
 <class '__main__.T'>
 >>> id(PT) == id(T)
 True 

python类对象(不是类实例,类对象本身)是单例还是类似的?我希望现在会有两个不同的类,但似乎只有一个类,以及两个不同的别名、引用或名称。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-03 09:54:35

函数和类本质上都是作为对全局变量的引用而进行的,注意,这就是为什么不能对lambda进行分类,或者不能在顶层定义的类和函数。来自文档

请注意,函数(内置和用户定义的)是由“完全限定”的名称引用(而不是按值)选择的。这意味着只对函数名进行了筛选,以及函数在其中定义的模块的名称。函数的代码和它的任何函数属性都不会被腌制。因此,定义模块必须在解酸洗环境中被导入,并且模块必须包含命名对象,否则会引发异常。3. 类似地,类是通过命名引用对其进行筛选的,因此在非泡沫化环境中也应用了相同的限制。请注意,类的任何代码或数据都不会被酸洗。

注意,文档还提供了一个关于如何为类对象重写此行为的示例

代码语言:javascript
复制
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 == 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70212138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档