python - python中类方法的自解封

标签 python deserialization self

我正在尝试创建一个可以使用类方法序列化和反序列化自身的对象,而不使用 return 语句(我不需要静态方法)。这是我的类(class)的一个概念,也是一个简单的用例:

import pickle

class A:
    def __init__(self):
        self.x = 0

    def add(self):
        self.x += 1

    def serialize(self, filename):
        """Simple object serialization given a filename"""
        with open(filename, 'wb') as f:
            pickle.dump(self, f)
            print("Serialized with value of: %d" % (self.x))

    def deserialize(self, filename):
        """Simple object deserialization given a filename"""
        with open(filename, 'rb') as f:
            print("self.x before load (inside deserialize): %d" % (self.x))
            self = pickle.load(f)
            print("Deserialized value inside deserialize function: %d" % (self.x))



a1 = A()
a2 = A()

a1.add()
a1.add()

a1.serialize('a.pkl')
a2.deserialize('a.pkl')

print("Deserialized value outside: %d" % (a2.x))

但是,一旦我离开反序列化方法,self(在本例中为实例a2)就不会保留其值。

运行时输出:

>> Serialized with value of: 2
>> self.x before load (inside deserialize): 0
>> Deserialized value inside deserialize function: 2
>> Deserialized value outside: 0

为什么会发生这种情况?我还尝试过在函数 deserialize 中的 pickle.load 之后使用 deepcopy 但似乎没有任何效果,我想了解为什么.

提前致谢

最佳答案

这不起作用的原因是因为你不能分配给 self (或者更确切地说:这样做并不像你认为的那样)。如果您有兴趣了解实际发生的情况,请尝试为 self 分配一些奇怪的内容,例如self = "foobar"(行为将保持不变)。


使反序列化成为一个类方法并将其用作“构造函数”:

@classmethod
def deserialize(cls, filename):
    """Simple object deserialization given a filename"""
    with open(filename, 'rb') as f:
        obj = pickle.load(f)
        print("Deserialized value inside deserialize function: %d" % (obj.x))
        return obj

然后像这样使用它:

a2 = A.deserialize('a.pkl')

输出:

Serialized with value of: 2
Deserialized value inside deserialize function: 2
Deserialized value outside: 2

关于python - python中类方法的自解封,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52853754/

相关文章:

objective-c - 为什么在调用自己的类方法时需要使用[self class]?

python - cmap 在seaborn 中如何工作以及如何更改分箱?

c# - 将二维数组转换为对象c#

python - 别名 self = super(...).__new__(...)?为什么?

Python 类方法改变自身

c# - 我可以在属性中指定路径以将类中的属性映射到 JSON 中的子属性吗?

python - Selenium 模拟鼠标滚轮下拉和 webdriverwait 替代 time.sleep

python - `poetry run black myscript.py` 和 `black myscript.py` 有什么区别?

Python SQLAlchemy 和 Postgres - 如何使用 json 值中的子字符串进行搜索

java - 通过消息队列进行序列化和反序列化