使属性只读的更短方法

Shorter way to make properties read-only

我在很多网站上看到,如果我想创建一个只读 属性,我应该使用 property 装饰器。

像这样:

class MyClass(object):
  def __init__(self):
    self._a = None

  @property
  def a(self):
    return self._a

如果我在 class 中只有 1-3 个只读属性,我认为这是一个很好的解决方案。但是,如果我可能有 10 个这样的东西怎么办?这将导致额外的 40 行代码仅用于将它们全部标记为只读。在我看来,这并不真正适合 Python,它是一种语言,您不必编写大量代码来做一些小事。

真的没有更短的方法可以在 Python 中使 属性 只读吗?

至少,您可以将 property 作为函数调用,而不是将其用作装饰器。同时,您可以将基础值存储在列表或字典中,而不是作为单独的属性。

class MyClass(object):
    def __init__(self):
        self._values = [...]

    a = property(lambda self: self._values[0])
    b = property(lambda self: self._values[1])
    # etc

然而,一个只读的 属性 并不真的需要将它的值存储在实例字典中;直接在 getter:

中硬编码值
class MyClass(object):

    a = property(lambda self: "foo")
    b = property(lambda self: "bar") 

然后将对 属性 的调用包装在另一个函数中:)

def constant(value):
    def _(self):
        return value
    return property(_)

class MyClass(object):
    a = constant("foo")
    b = constant("bar")

这是一个纯 Python 只读 属性,仿照 https://docs.python.org/3/howto/descriptor.html#properties:

中显示的示例
class Constant(object):
    def __init__(self, value)
        def _(self):
            return value
        self.fget = _

    def __get__(self, obj, objtype=None):
        if obj is None:
            return self
        return self.fget(obj)

这可能比继承 property 并覆盖 __set____del__ 到 "unimplement" 它们更简单。但是,我更喜欢围绕常规 属性 包装的想法。