我有一个代码:
def constant(f):
def fset(self, value):
raise SyntaxError( "You can't change a constant!" )
def fget(self):
return f(self)
return property(fget, fset)
class A( object ):
def __init__( self, a_list ):
super( A, self ).__init__()
self.__data = a_list[:]
@constant
def data( self ):
return self.__data
我想让自我.__数据可访问,但不可更改且无法从课堂外进行。我不能简单地将它改为元组,因为我希望它能够很容易地改变类中的方法。当有人修改列表时,我上面提到的解决方案不起作用:
>>> a = A( range(5) )
>>> a.data = []
Traceback (most recent call last):
...
SyntaxError: You can't change a constant! # it works
>>> a.data[0]=6 # it doesn't work
>>> a.data
[6, 1, 2, 3, 4]
你知道我的问题有什么好办法吗?
答案 0 :(得分:1)
提供一些不应该更改的提示,但如果他们真的需要,可以让人们进行更改。
如果您希望不可修改list
使用tuple
。使用前导下划线来获得额外的"安全"。
总有办法在Python中更改 list 。即使我不得不闯入你的房子,窃取你的代码然后改变它 - 它是可能的。
_change_this_and_I_will_kill_you_with_my_axe = [] # never use this name
如果你是。退货清单并且不希望修改退货复印件,但 仍然可以修改它。
return my_list[:]
答案 1 :(得分:1)
您还可以创建一个实现列表所有读取操作的View类。当然,仍然有办法访问内部列表,没有办法阻止它。
class ListView(object):
def __init__(self, list_):
self._list = list_
def __getitem__(self, index):
return self._list[index]
def __repr__(self):
return 'ListView(%r)' % self._list
def index(self, value):
return self._list.index(value)
# and so on
(从移动设备发送)