我需要保护一个类变量。但是如果类支持保存和加载选项该怎么办?
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
列表,并且它可以从外部更改,这在我的情况下很危险。
有什么方法吗?
答案 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
的实例的对象。