代码之家  ›  专栏  ›  技术社区  ›  Iván Sánchez

python类方法中的自卸扣

  •  0
  • Iván Sánchez  · 技术社区  · 7 年前

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

    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
    

    为什么会这样?我也试过 deepcopy 就在比赛结束后 pickle.load deserialize 但似乎什么都不管用,我想知道为什么。

    提前谢谢

    1 回复  |  直到 7 年前
        1
  •  2
  •   L3viathan gboffi    7 年前

    这不起作用的原因是因为你不能分配给自己(或者更确切地说:这样做不会做你认为它做的事情)。如果你想知道到底发生了什么,试着给他们分配一些奇怪的东西 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
  •  2
  •   Heny Ben Ayed    6 年前

    抱歉反应太晚了。 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))