替换 python 中对象的实例

Replace Instance of an object in python

我有一个 class,其中一种方法是在需要时替换封装在对象中的整个数据。但是,我不确定如何将更新数据写入对象。是否可以将实例分配给新实例,也许像 self=new_self?我知道我可以创建一个新实例,然后更改 ptr 以指向它,但我想检查一下我是否可以只更新同一个实例。

class Dictionary:

    def __init__(self, collection_size):
        self.dictionary = [Term() for _ in range(collection_size)]
        self.collection_size = collection_size

    def load(self, src):
        with open(src, 'rb') as handle:
            self = pickle.load(handle)  # this is the part that needs editing

我认为 class 方法可能最有意义,比如

class Dictionary:
    def __init__(self, collection_size):
        self.dictionary = [Term() for _ in range(collection_size)]
        self.collection_size = collection_size

    @classmethod
    def load_from_pickle(cls, src):
        with open(src, 'rb') as handle:
            cls = pickle.load(handle)
        return cls

loaded_dictionary = Dictionary.load_from_pickle('path/to/pickle')

您可能需要在加载方法上设置一些“防护栏”,以确保您正在解开一个有效的对象。

在某些时候,您可能还需要某种 Dictionary.merge,但这似乎与从 pickled 对象初始化无关。

感谢大家的回复。我混合使用了 Andrew 和 Juanpa 的答案。由于我的数据处理方式,没有必要进行合并,但是 + 添加 try/except 到 load_from_pickle 是一个很好的观点。这就是我所确定的。警告:不确定再次调用 init 是否是禁忌。

class Dictionary:

def __init__(self, collection_size=None, dictionary=None):
    self.dictionary = dictionary if dictionary else {}
    self.collection_size = collection_size
    self.collection_postings_list_ptr = 0

def load(self, src):
    with open(src, 'rb') as handle:
        new_dictionary = pickle.load(handle)
        self.__init__(new_dictionary.collection_size, new_dictionary.dictionary)