常量变量?

mik*_*ana 8 python setter properties instance-variables instance

@property用来确保对对象实例变量的更改由我需要的方法包装.

当一个实例有一个逻辑上不应该改变的变量时呢?例如,如果我正在为一个Process创建一个类,那么每个Process实例都应该有一个经常被访问但不应该被更改的PID属性.

什么是处理试图修改该实例变量的人的最Pythonic方法?

  • 只是相信用户不要尝试改变他们不应该做的事情?

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

  • 别的什么?

Cat*_*lus 8

在前面添加变量的名称__,并创建只读属性,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
Run Code Online (Sandbox Code Playgroud)

  • 非严重名称的问题在于它们可能会在子类中被意外覆盖.由于这些字段不是您的公共API的一部分,因此不应要求API客户端知道您的"私人"字段的名称,但他们必须这样做,因为否则他们可能会破坏您的课程.当然,如果在类的新版本中引入新字段,则可以破坏具有已使用相同字段名称的子类的现有客户端.Mangled版本仍然存在所有这些问题,但它确实降低了很多可能性. (2认同)