0
class teste(object):
    def __init__(self,a):
        self.a=a

    def getA(self):
        return self.a



new=teste("lucas")
print new.getA()  #########  LINE 1
print new.a       #########  LINE 2 

为什么在类中我们总是需要这种“get”方法?我的意思是,“LINE 1”和“LINE 2”有什么区别?他们输出相同的东西。

4

5 回答 5

4

你不在 Python 中。

请注意,getter 和 setter 经常被认为是“un pythonic ”(相关:) python -c 'import this'

吸气剂只是一种风格。有时您可能想使用吸气剂,但并不总是必要的。了解为什么使用 getter 和 setter来进行关于 getter 和 setter 的一般性讨论。

对于 Python 的更多相关性,请考虑:
一个意见片另一个意见片一些示例代码一些其他示例代码

于 2013-02-21T21:32:36.173 回答
3

在 python 中,您不需要 get 方法。这是编码风格的问题。

于 2013-02-21T21:29:39.300 回答
1

其他答案已经说您在 Python 中永远不需要 getter,这只是风格问题。

但这里的关键是有一种 Pythonic 风格,不必要的 getter 与这种风格背道而驰。当有经验的 Python 开发人员阅读您的代码时,使用不必要的 getter 会引发危险信号。(这里需要多少秒才能得到三个评论说“有人使用 Java 太多了”的变体?)

如果您阅读 PEP 8 样式指南,在Designing for继承下,它说:

对于简单的公共数据属性,最好只公开属性名称,而不需要复杂的访问器/修改器方法。请记住,如果您发现简单的数据属性需要增加功能行为,Python 提供了一条通往未来增强的简单途径。在这种情况下,使用属性将功能实现隐藏在简单的数据属性访问语法后面。

PEP 8 仅用作标准库的样式指南,但它仍然被普遍认为是对 Python 惯用的外观的良好描述(“TOOWTDI”意味着任何描述性指南都隐含地是规范性指南,至少在理论上),并且有不错的测试人员和修复程序,可让您根据 PEP 8 指南测试自己的代码。


当我在这里时,William 的答案与为什么使用 getters 和 setters相关联,这是一个与语言无关的问题,其中接受的答案是访问器有时是个好主意的原因列表。它们几乎都与 Python 无关。大多数可以用一个词来回答:(@property或者,在最后一种情况下,attrgetter)。对于其余的:

  • 控制生命周期和内存管理…… Python 已经管理了内存。
  • 提供调试截取点...解释型语言可以在调试时轻松放置观察点。
  • 改进了与库的互操作性…… Python 的mockpickle等旨在使用属性进行操作。
  • 允许继承者更改属性行为方式的语义,并通过覆盖 getter/setter 方法来公开。这仅与具有静态类型的语言相关,但虚函数除外,例如 C++ 或 Java。
于 2013-02-21T21:55:40.253 回答
0

您不需要使用“get”方法,您的示例中唯一的区别是,如果您使用new.a,您可以为其分配一个新值。

因此,如果您打算拥有一个只读属性,那么 get 方法是合适的。(请注意,如果该方法返回一个可变对象,您可以修改该对象,因此在技术上不是只读的)

于 2013-02-21T21:31:53.710 回答
0

通常在 Python 中,我们只使用普通的属性访问。如果您决定稍后需要“getters”和“setters”,您可以轻松地将它们转换为properties。你不需要“以防万一”把你的代码弄得乱七八糟

对我来说重要的一点是,当你这样做时,你不需要更改任何使用该类的代码。

于 2013-02-21T21:52:40.520 回答