我用@property
来确保一个对象实例变量的变化是由在那里我需要的方法包裹。
怎么样当一个实例具有逻辑上不应该被改变的变量? 例如,如果我制作类流程,每个流程实例应该有会频繁访问,但不应该被改变的PID属性。
什么是处理有人试图修改该实例变量的最Python的方式?
单纯的信任用户不要尝试改变的东西,他们不应该?
使用属性,但如果该实例变量改变引发异常?
别的东西?
我用@property
来确保一个对象实例变量的变化是由在那里我需要的方法包裹。
怎么样当一个实例具有逻辑上不应该被改变的变量? 例如,如果我制作类流程,每个流程实例应该有会频繁访问,但不应该被改变的PID属性。
什么是处理有人试图修改该实例变量的最Python的方式?
单纯的信任用户不要尝试改变的东西,他们不应该?
使用属性,但如果该实例变量改变引发异常?
别的东西?
与变量的前面加上名字__
,并创建只读属性,Python会照顾例外,而变量本身将受到保护,免受意外覆盖。
class foo(object):
def __init__(self, bar):
self.__bar = bar
@property
def bar(self):
return self.__bar
f = foo('bar')
f.bar # => bar
f.bar = 'baz' # AttributeError; would have to use f._foo__bar
简单地信任用户并不一定是坏事, 如果你只是简单写Python程序被使用一次,扔掉,你很可能会只相信用户不会改变PID字段。
恕我直言,以执行只读领域最Python的方式是使用引发的企图设置字段异常的性质。
因此,恕我直言,你有这个东西很好的直觉。
也许你可以重写__setattr__
? 在该行,
def __setattr__(self, name, value):
if self.__dict__.has_key(name):
raise TypeError, 'value is read only'
self.__dict__[name] = value
只需使用属性和隐藏属性(有一个下划线前缀)。
简单属性为只读!
>>> class Test (object):
... @property
... def bar(self):
... return self._bar
...
>>> t = Test()
>>> t._bar = 2
>>> t.bar
2
>>> t.bar = 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
双下划线隐藏不用于隐藏实现,但要确保你不与子类的属性发生碰撞; 考虑一个mixin例如,它必须非常小心!
如果你只想隐藏属性,使用单下划线。 正如你看到没有多余的魔力增加 - 如果不定义一组功能,你的财产只是为只读,作为方法的返回值。