为了账号安全,请及时绑定邮箱和手机立即绑定

python中类方法中的自解压

python中类方法中的自解压

慕慕森 2021-07-16 18:00:15
我正在尝试创建一个可以使用类方法序列化和反序列化自身的对象,而不使用 return 语句(我不想要静态方法)。这是我的班级的一个概念和一个天真的用例:import pickleclass 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为什么会这样?我也尝试过在函数deepcopy之后使用pickle.load,deserialize但似乎没有任何效果,我想了解原因。
查看完整描述

2 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

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


制作deserialize一个类方法并将其用作“构造函数”:


@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')

输出:


序列化值:2

反序列化函数内部反序列

化值:2 外部反序列化值:2


查看完整回答
反对 回复 2021-07-21
?
HUWWW

TA贡献1874条经验 获得超12个赞

回复晚了非常抱歉。Pickle 将对象扁平化为字典。这是修复它的方法:


    def serialize(self, filename):

        """Simple object serialization given a filename"""

        with open(filename, 'wb') as f:

            pickle.dump(self.__dict__, 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.__dict__ = pickle.load(f)

            print("Deserialized value inside deserialize function: %d" % (self.x))


查看完整回答
反对 回复 2021-07-21
  • 2 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信