【问题标题】:Python class variables or @propertyPython 类变量或@property
【发布时间】:2017-12-05 00:44:24
【问题描述】:

我正在编写一个 python 类来存储数据,然后另一个类将创建该类的一个实例来打印不同的变量。一些类变量需要大量格式化,可能需要多行代码才能使其处于“最终状态”。

只使用这种结构从类外部访问变量是不好的做法吗?

class Data():
    def __init__(self):
        self.data = "data"

还是使用@property 方法访问变量更好?

class Data:
    @property
    def data(self):
        return "data"

【问题讨论】:

  • 属性语言支持的全部意义在于让您永远不必做出此决定。您从普通属性开始,并在有意义时使用属性。
  • @IgnacioVazquez-Abrams 你说得有道理......但在 python 中很难看到,因为默认情况下可以访问所有属性。
  • 从简单的属性访问开始。稍后,如果您发现需要控制访问,请将其设为属性,但仅此而已。这就是整个point
  • 另外,您指的是 instance 变量,而不是 类变量

标签: python properties getter-setter


【解决方案1】:

小心,如果你这样做:

class Data:
    @property
    def data(self):
        return "data"

d = Data()
d.data = "try to modify data"

会给你错误:

AttributeError: 无法设置属性

正如我在您的问题中看到的那样,您希望能够将数据转换到其最终状态,因此,请选择其他选项

class Data2():
    def __init__(self):
        self.data = "data"

d2 = Data2()
d2.data = "now I can be modified"

或修改前文:

class Data:
  def __init__(self):
    self._data = "data"

  @property
  def data(self):
      return self._data

  @data.setter
  def data(self, value):
    self._data = value

d = Data()
d.data = "now I can be modified"

【讨论】:

    【解决方案2】:

    常见做法

    Python 中的常规做法是直接暴露属性。如果在获取或设置时需要其他操作,可以稍后添加属性。

    标准库中的大多数模块都遵循这种做法。公共变量(不带下划线前缀)通常不使用 property(),除非有特定原因(例如将属性设为只读)。

    基本原理

    普通属性访问(无属性)实现简单、易于理解、运行速度非常快。

    之后使用property()的可能性意味着我们不必练习defensive programming。我们可以避免过早地实现 getter 和 setter,这会使代码膨胀并使访问速度变慢。

    【讨论】:

      【解决方案3】:

      基本上,您可以在属性中隐藏很多复杂性并使其看起来像一个属性。这增加了代码的可读性。

      另外,您需要了解属性和属性之间的区别。 请参考What's the difference between a Python "property" and "attribute"?

      【讨论】:

        猜你喜欢
        • 2019-03-27
        • 2011-03-24
        • 1970-01-01
        • 2021-04-14
        • 1970-01-01
        • 2022-06-10
        • 2012-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多