python中的用户定义的类序列化和反序列化

时间:2018-08-27 23:47:14

标签: python python-2.7

我是python的新手:我想在python中序列化和反序列化我的自定义对象。请同样指导我。我有一个示例课:

import pickle  
import json

class MyClass():   
    variable = "blah"  
    num = 10

    def function(self):
        print("this is a message inside the class.")

    def get_variable():
        return variable

    def get_num():
        return num

def main():
    myObj = MyClass()
    with open('/opt/infi/deeMyObj.txt', 'w') as output:
        pickle.dump(myObj, output,pickle.HIGHEST_PROTOCOL)

    with open('/opt/infi/deeMyObj.txt', 'r') as input:
        myObjread = pickle.load(input)
        print myObjread.get_variable()
        print myObjread.get_num()

main()

我遇到以下错误:

回溯(最近通话最近一次):

文件“ sample.py”,第30行,位于

main()

文件“ sample.py”,主行,第27行

print myObjread.get_variable()

TypeError:get_variable()不接受任何参数(给定1个)

主要目的是读回该对象。

1 个答案:

答案 0 :(得分:0)

要在jasonharper's comment上进行扩展,您的get_variableget_num方法未引用类的成员变量。他们应将对象作为第一个参数,例如

class MyClass:
    ...
    def get_variable(self):
        return self.variable

我认为您的序列化代码还可以,但是我可能错了。

(放在一边) 这有点题外话,但要注意另一件事:当您直接在class块中定义变量时,它们是在类上定义的,而不是在该类的对象上定义的。在这种情况下,这种情况确实可以解决,因为如果Python在对象上找不到一个同名的类级变量,它将寻找它。但是,如果您将列表存储在其中一个列表中并开始对其进行修改,那么最终将在对象之间共享它,这可能不是您想要的。相反,您想在__init__方法中对其进行定义:

class MyClass:
    def __init__(self):
        self.variable = "blah"