怎么解決python中TypeError: can't pickle instancemethod objects的這個錯誤


最近在用python的cPickle和Pickle模塊來序列化,如果對序列化不了解,可以點擊這里,序列化的時候遇到一個問題

TypeError: can't pickle instancemethod objects

在谷歌百度上查了很多,但是終究沒有答案,我突然想,一般如果類比較簡單,不能是不被pickle的,所以我想,一定是初始化一個實例的時候實例的屬性某些屬性導致不能被pickle,那么如果判斷哪些屬性是不能被pickle的呢?這里可以通過寫一個函數來實現

  • 首先在類中定義__getstate__()函數
  • def __getstate__(self):
         return self.__dict__
  • 然后你可以定義get_pickling_errors()函數
  •  1 import pickle
     2 def get_pickling_errors(obj,seen=None):
     3     if seen == None:
     4         seen = []
     5     try:
     6         state = obj.__getstate__()
     7     except AttributeError:
     8         return
     9     if state == None:
    10         return
    11     if isinstance(state,tuple):
    12         if not isinstance(state[0],dict):
    13             state=state[1]
    14         else:
    15             state=state[0].update(state[1])
    16     result = {}    
    17     for i in state:
    18         try:
    19             pickle.dumps(state[i],protocol=2)
    20         except pickle.PicklingError:
    21             if not state[i] in seen:
    22                 seen.append(state[i])
    23                 result[i]=get_pickling_errors(state[i],seen)
    24     return result
  • 那如何使用呢?
  • >>> my_instance = My_Class()
    >>> get_pickling_errors(my_instance)
    {'_gen': {}, '_base': {'_gens': None}}

    這說明類My_Class的實例my_instance的屬性_gen以及其父類的_gen是不能被pickle的

通過上面的方法,我找到了不能被pickle的實例的屬性.成功解決了我的問題.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM