【发布时间】:2015-11-22 02:46:29
【问题描述】:
我有一个代码:
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
我想让 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]
你知道我的问题有什么好的解决方案吗?
【问题讨论】:
-
所以你想让它看起来是外部的,但实际上不是内部的?为什么? “在这里,我们都是同意的成年人” - 列表中只需一个前导下划线就足够了。
-
另一种选择是使
datareturn self.__data[:],然后如果接收到它确实改变它没关系。 -
考虑引发自定义异常而不是
SyntaxError,因为如果有人试图以您不喜欢的方式使用您的对象,这并不是语法问题。 -
@CristianCiupitu 因为这个想法是在内部保留可变性。其他类方法应该能够更改内部列表,但在类之外没有任何内容。 (这基本上是关于 Python 不支持的一种封装。)