如何序列化包含在 python 中调用其他类的方法的类?

问题描述

我正在尝试并行化一些创建 Predictor 类实例代码。这个类包含 许多方法属性,看起来像这样:

class Predictor:
    def__init__(...):

    def load_models(...):

    def load_data(...):
    
    def predict(...):

DataManager 方法调用 load_data 类的地方。当我添加 __reduce__ 函数时,它只会序列化 Predictor 类的方法,而不是 DataManager 类的方法。如何在 Predictor 类中序列化并包含所有属性方法

编辑:

from generators import DataManager #class used to load data
class Predictor:


    def __init__(self,saved_model_dir,QS_params=None):
        '''
        

        Parameters
        ----------
        saved_model_dir : str
            Predictor directory.
        params : dict
            A dictionary of all predictor 
            algorithms
        '''
        self.saved_model_dir = saved_model_dir
        
        # attributes to save or serialize
        self.save_attr  = ['onehot_cutoffdate','name','version_number','batch_size','aggregate_data','test_size'] 
        if(params!=None):
            self.params  = params

    def loadDataManager(self,name=None,batch_size=None,test_size=None,..)
        data_fp = self.saved_model_dir + '/path_to_data'
        self.dataManager = DataManager(self,data_fp,self.name,self.batch_size,self.test_size,...)

如何序列化类的所有方法及其属性(self.save_attr 中的列表)?

我正在尝试将其与 ray 一起使用,并添加一个 __reduce__ 函数,如下所示:

class Predictor:


    def __init__(self,'test_size'] 
        if(params!=None):
            self.params  = params


    def __reduce__(self):
        '''This is necessary for serializing the class. Every attribute needed needs to be in the serializer line''' 
        deserializer = Predictor
        serializer = (self.saved_model_dir,self.save_attr,self.QS_params,)
        return deserializer,serializer

但是,当我尝试将这个类与 Ray 一起使用时,我会得到一个 AtrributeError,因此似乎所有内容都必须序列化。

>>> predictor.dataManager
<generators.DataManager object at 0x7fac0c00c290>
>>> ray.get(ray.put(predictor)).dataManager
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
AttributeError: 'Predictor' object has no attribute 'dataManager'

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)