【问题标题】:Serializing functions/classes in python在python中序列化函数/类
【发布时间】:2015-11-06 19:46:30
【问题描述】:

我不知道如何序列化。从网上冲浪了解到,dill 可以序列化函数和类。我在下面有一个示例,其中有两个类,每个类都有一些具有不同参数的函数。我想将它们全部序列化。有人可以帮我解决这个问题吗

class dummy_class_1:
   def dummy_func_1(self,master):
    ..

   def dummy_func_2(self):
    ...

class dummy_class_2:
    def dummy_func_3(self,event):
    ...

    def dummy_func_4(self):
    ...

【问题讨论】:

    标签: python-3.x serialization pickle dill


    【解决方案1】:

    如果你想将这些类一起序列化,那么你可以将它们dump 转换成一个字符串:

    >>> class dummy_class_1(object):
    ...   def dummy_func_1(self, master):
    ...     return
    ...   def dummy_func_2(self):
    ...     return
    ... 
    >>> class dummy_class_2(object):
    ...   def dummy_func_3(self, event):
    ...     return
    ...   def dummy_func_4(self):
    ...     return
    ... 
    >>> import dill
    >>>          
    >>> dill.dumps((dummy_class_1, dummy_class_2))
    '\x80\x02cdill.dill\n_create_type\nq\x00(cdill.dill\n_load_type\nq\x01U\x08TypeTypeq\x02\x85q\x03Rq\x04U\rdummy_class_1q\x05h\x01U\nObjectTypeq\x06\x85q\x07Rq\x08\x85q\t}q\n(U\n__module__q\x0bU\x08__main__q\x0cU\x0cdummy_func_1q\rcdill.dill\n_create_function\nq\x0e(cdill.dill\n_unmarshal\nq\x0fUpc\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00C\x00\x00\x00s\x04\x00\x00\x00d\x00\x00S(\x01\x00\x00\x00N(\x00\x00\x00\x00(\x02\x00\x00\x00t\x04\x00\x00\x00selft\x06\x00\x00\x00master(\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00<stdin>t\x0c\x00\x00\x00dummy_func_1\x02\x00\x00\x00s\x02\x00\x00\x00\x00\x01q\x10\x85q\x11Rq\x12c__builtin__\n__main__\nh\rNN}q\x13tq\x14Rq\x15U\x0cdummy_func_2q\x16h\x0e(h\x0fUec\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00C\x00\x00\x00s\x04\x00\x00\x00d\x00\x00S(\x01\x00\x00\x00N(\x00\x00\x00\x00(\x01\x00\x00\x00t\x04\x00\x00\x00self(\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00<stdin>t\x0c\x00\x00\x00dummy_func_2\x04\x00\x00\x00s\x02\x00\x00\x00\x00\x01q\x17\x85q\x18Rq\x19c__builtin__\n__main__\nh\x16NN}q\x1atq\x1bRq\x1cU\x07__doc__q\x1dNutq\x1eRq\x1fh\x00(h\x04U\rdummy_class_2q h\x08\x85q!}q"(h\x0bh\x0cU\x0cdummy_func_3q#h\x0e(h\x0fUoc\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00C\x00\x00\x00s\x04\x00\x00\x00d\x00\x00S(\x01\x00\x00\x00N(\x00\x00\x00\x00(\x02\x00\x00\x00t\x04\x00\x00\x00selft\x05\x00\x00\x00event(\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00<stdin>t\x0c\x00\x00\x00dummy_func_3\x02\x00\x00\x00s\x02\x00\x00\x00\x00\x01q$\x85q%Rq&c__builtin__\n__main__\nh#NN}q\'tq(Rq)U\x0cdummy_func_4q*h\x0e(h\x0fUec\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00C\x00\x00\x00s\x04\x00\x00\x00d\x00\x00S(\x01\x00\x00\x00N(\x00\x00\x00\x00(\x01\x00\x00\x00t\x04\x00\x00\x00self(\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00<stdin>t\x0c\x00\x00\x00dummy_func_4\x04\x00\x00\x00s\x02\x00\x00\x00\x00\x01q+\x85q,Rq-c__builtin__\n__main__\nh*NN}q.tq/Rq0h\x1dNutq1Rq2\x86q3.'
    

    或者,您可以dump 将它们写入文件...

    >>> with open('dummy.pkl', 'wb') as f:
    ...   dill.dump(dummy_class_1, f)
    ...   dill.dump(dummy_class_2, f)
    ... 
    >>>
    

    然后当你重启时,你可以load他们:

    Python 2.7.10 (default, Sep  2 2015, 17:36:25) 
    [GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import dill
    >>> with open('dummy.pkl', 'rb') as f:
    ...   dummy_class_1 = dill.load(f)
    ...   dummy_class_2 = dill.load(f)
    ... 
    >>> print dill.source.getsource(dummy_class_1)
    class dummy_class_1(object):
      def dummy_func_1(self, master):
        return
      def dummy_func_2(self):
        return
    
    >>> 
    

    类方法(即类中的函数)只会在类中序列化。

    请注意,我在回复中使用了 python 2.7,但它对 python 3.x 的工作方式完全相同。

    【讨论】:

    • 谢谢!我基本上正在使用python开发GUI(tkinter),我认为保存按钮应该保存GUI的状态,一旦加载,它应该从该状态加载GUI。你认为序列化类会有所帮助吗
    • 视情况而定。一些类实例比其他类更难序列化,但如果类是从另一个文件导入并通过引用腌制的,它们通常应该可以工作。
    • 我们如何通过引用腌制...我是新手
    • 如果你使用pickle,它将通过引用腌制一个类。如果您使用dill,则必须设置byref=True,可以使用dill.settings['byref'] = True 全局设置,也可以使用dill.dump(object_to_pickle, byref=True) 进行每次调用
    • 谢谢!!通过这样做,我仍然无法保存 GUI 的当前状态。我也必须转储小部件吗?
    猜你喜欢
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多