簡體   English   中英

在python中從酸洗中排除對象的字段

[英]Exclude object's field from pickling in python

我想避免在類的實例中對某些字段進行酸洗。 目前,在酸洗之前,我只是將這些字段設置為無,但我想知道是否有更優雅的解決方案?

處理非picklable對象的實例屬性的一種方法是使用可用於修改類實例狀態的特殊方法: __getstate__()__setstate__() 這是一個例子

class Foo(object):

    def __init__(self, value, filename):
        self.value = value
        self.logfile = file(filename, 'w')

    def __getstate__(self):
        """Return state values to be pickled."""
        f = self.logfile
        return (self.value, f.name, f.tell())

    def __setstate__(self, state):
        """Restore state from the unpickled state values."""
        self.value, name, position = state
        f = file(name, 'w')
        f.seek(position)
        self.logfile = f

Foo的實例被腌制時,Python 只會在調用實例的__getstate__()方法時腌制返回給它的值。 同樣,在 unpickling 期間,Python 將提供 unpickled 值作為實例的__setstate__()方法的參數。 __setstate__()方法中,我們能夠根據我們腌制的名稱和位置信息重新創建文件對象,並將文件對象分配給實例的日志文件屬性。

參考: http : //www.ibm.com/developerworks/library/l-pypers.html

文檔中有一個示例可以解決您的__getstate____setstate__問題。

__getstate__使用對象的__getstate____setstate__方法; 您可以覆蓋它們並忽略您想要的字段。

# foo.py
class Foo:
    def __init__(self):
        self.bar = 1
        self.baz = 2

    def __getstate__(self):
        state = self.__dict__.copy()
        # Don't pickle baz
        del state["baz"]
        return state

    def __setstate__(self, state):
        self.__dict__.update(state)
        # Add baz back since it doesn't exist in the pickle
        self.baz = 0
# main.py
import pickle

from foo import Foo


foo = Foo()
print(f"Foo bar: {foo.bar} baz: {foo.baz}")

new_foo = pickle.loads(pickle.dumps(foo))
print(f"New bar: {new_foo.bar} baz: {new_foo.baz}")

輸出:

Foo bar: 1 baz: 2
New bar: 1 baz: 0

你可以在這里找到另一個例子: https : //docs.python.org/3/library/pickle.html#handling-stateful-objects

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM