恒实例变量?(Constant instance variables?)

2019-08-17 08:57发布

我用@property来确保一个对象实例变量的变化是由在那里我需要的方法包裹。

怎么样当一个实例具有逻辑上不应该被改变的变量? 例如,如果我制作类流程,每个流程实例应该有会频繁访问,但不应该被改变的PID属性。

什么是处理有人试图修改该实例变量的最Python的方式?

  • 单纯的信任用户不要尝试改变的东西,他们不应该?

  • 使用属性,但如果该实例变量改变引发异常?

  • 别的东西?

Answer 1:

与变量的前面加上名字__ ,并创建只读属性,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


Answer 2:

简单地信任用户并不一定是坏事, 如果你只是简单写Python程序被使用一次,扔掉,你很可能会只相信用户不会改变PID字段。

恕我直言,以执行只读领域最Python的方式是使用引发的企图设置字段异常的性质。

因此,恕我直言,你有这个东西很好的直觉。



Answer 3:

也许你可以重写__setattr__ ? 在该行,

def __setattr__(self, name, value):
    if self.__dict__.has_key(name):
        raise TypeError, 'value is read only'
    self.__dict__[name] = value


Answer 4:

只需使用属性和隐藏属性(有一个下划线前缀)。

简单属性为只读!

>>> 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例如,它必须非常小心!

如果你只想隐藏属性,使用单下划线。 正如你看到没有多余的魔力增加 - 如果不定义一组功能,你的财产只是为只读,作为方法的返回值。



文章来源: Constant instance variables?