【问题标题】:python pickle dump and load private variablespython pickle 转储和加载私有变量
【发布时间】:2014-05-10 16:08:00
【问题描述】:

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

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

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

有没有办法解决这个问题?

【问题讨论】:

  • 在 python 中没有保护。即使在外面,您也可以随时更改__a
  • 属性与保存/加载有什么关系?
  • 是的,但您无权访问它。尝试 instance.__a 并被 AttributeError 拒绝
  • 试试_data__a,你就可以访问__a

标签: python numpy pickle private-members


【解决方案1】:

为防止列表被更改,您可以通过您的财产返回一份列表副本:

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

【讨论】:

  • 这是一个副本,我正在处理大量数据。
【解决方案2】:

不要使用非标准的保存/加载方法,而是使用标准的 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

【讨论】:

    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    相关资源
    最近更新 更多