python pickle转储和加载私有变量

时间:2014-05-10 16:08:01

标签: python numpy pickle private-members

我需要保护一个类变量。但是如果类支持保存和加载选项该怎么办?

import numpy as np
import pickle
class data(object):
    def __init__(self):
        self.__a = range(100)

    @property    
    def a(self):
         return self.__a

    def save(self, path):
        pickle.dump(self,open(path, 'wb'), protocol=2)

    def load(self, path):
        obj = pickle.load(open(path, 'wb'))
        self.__a = obj.a

这很简单,但__a属性不再受到保护,因为调用instance.a会返回确切的instance.__a列表,并且它可以从外部更改,这在我的情况下很危险。

有什么方法吗?

2 个答案:

答案 0 :(得分:1)

为了保护列表不被更改,您可以通过您的财产返回列表的副本:

@property
def a(self):
    return list(self.__a)

答案 1 :(得分:0)

而不是非标准的保存/加载方法,坚持使用标准的pythonic酸洗方法,即直接使用pickle.dump和pickle.load。

数据成员在加载之后将像一样受保护,就像转储之前一样,即您的对象行为相同。

class data(object):
    def __init__(self):
        self.__a = range(100)
    @property    
    def a(self):
         return self.__a

obj = data()
# when you want to save, do:
x = pickle.dumps(obj)
# and for loading, do:
obj = pickle.loads(x)
obj.__dict__
=> {'_data__a': [0,
  1,
  2,
  3,
  ...
]} 

这种方法有许多优点,例如您可以安全地挑选引用您的班级data的实例的对象。