【问题标题】:Should I use properties or getters and setters?我应该使用属性还是 getter 和 setter?
【发布时间】:2017-10-09 07:38:11
【问题描述】:

我知道在python中使用getter和setter不是pythonic。应该使用属性装饰器。但我想知道以下情况 -

我有一个用一些实例属性初始化的类。然后稍后我需要向该类添加其他实例属性。如果我不使用 setter,那么我必须在课堂外的任何地方写 object.attribute = value。该类将没有self.attribute 代码。当我需要跟踪类的属性时,这会不会成为一个问题(因为它们散布在类外的代码中)?

【问题讨论】:

标签: python python-3.x properties getter-setter


【解决方案1】:

一般来说,您甚至不应该使用属性。简单属性在绝大多数情况下都能正常工作:

class X:
    pass

>>> x = X()
>>> x.a
Traceback (most recent call last):
  # ... etc
AttributeError: 'X' object has no attribute 'a'
>>> x.a = 'foo'
>>> x.a
'foo'

只有当您在访问属性时需要做一些工作时才应该使用属性:

import random

class X:

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

>>> x = X()
>>> x.a
0.8467160913203089

如果您还需要能够分配给一个属性,定义一个 setter 很简单:

class X:

    @property
    def a(self):
        # do something clever
        return self._a

    @a.setter
    def a(self, value):
        # do something even cleverer
        self._a = value

>>> x = X()
>>> x.a
Traceback (most recent call last):
  # ... etc
AttributeError: 'X' object has no attribute '_a'
>>> x.a = 'foo'
>>> x.a
'foo'

请注意,在每种情况下,客户端代码访问属性或属性的方式完全相同。没有必要为你的类“面向未来”,以防止在某些时候你可能想做一些比简单属性访问更复杂的事情,所以没有理由编写属性、getter 或 setter ,除非你真的需要它们现在

有关惯用 Python 与其他一些语言在属性、getter 和 setter 方面的区别的更多信息,请参阅:

【讨论】:

  • “只有在访问属性时需要做一些工作时才应该使用属性”是什么意思?
  • @guy 在整个答案的背景下,这对我来说似乎是不言自明的……请问您对此有何困惑?
  • 我正在努力确定何时使用/不使用 @property 装饰器。我认为它会自动将属性设为只读,但似乎并非如此。我还认为如果你有一个从其他属性计算的属性,那么你想要这个装饰器,但我不知道为什么.....
  • @guy 没有setter,从外面看,属性确实像一个只读属性,但这不是它的for,实际上是故意使在任何情况下,只读属性都违背了 Python 的“成人同意”理念。正如您所说,属性是指在访问它们时需要进行一些计算的属性。关于其目的和用途的完整教程超出了此答案的范围;除了我已经给出的链接之外,也许this article 对你有用。
猜你喜欢
  • 1970-01-01
  • 2014-10-07
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 2020-12-27
  • 2011-09-27
  • 1970-01-01
相关资源
最近更新 更多