为什么总是需要这种“获取”方法?

时间:2013-02-21 21:28:03

标签: python class

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 

为什么在课堂上我们总是需要这种“获取”方法?我的意思是,“LINE 1”和“LINE 2”之间有什么区别?他们输出同样的东西。

5 个答案:

答案 0 :(得分:4)

你不是用Python。

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

Getters只是一种风格。有时您可能想要使用getter,但它是not always necessary。有关getter和setter的一般性讨论,请参阅why use getters and setters

要获得与Python的更多相关性,请考虑:
An opinion pieceanother opinion piecesome sample codesome other sample code

答案 1 :(得分:3)

在python中,你不需要获取方法。这是编码风格的问题。

答案 2 :(得分:1)

其他答案已经说过你从来不需要Python中的getter,这只是风格问题。

但关键在于有一种Pythonic风格,不必要的吸气者违背这种风格。当有经验的Python开发人员阅读代码时,使用不必要的getter会引发危险信号。 (需要多少秒才能得到三条评论,说“有人在这里使用过多的Java”?)

如果您阅读PEP 8样式指南,请在Designing for inheritance下面说明:

  

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

PEP 8仅作为stdlib的样式指南,但它通常被认为是对惯用的Python看起来很好的描述(“TOOWTDI”意味着任何描述性指南都是隐含的说明性指南,至少在理论上是如此),并且有很好的测试人员和修复工具可以让您根据PEP 8指南测试自己的代码。


在我看到它时,威廉的答案与why use getters and setters有关,这是一个与语言无关的问题,其中接受的答案是为什么访问者有时候是一个好主意的原因列表。几乎没有一个与Python相关。大多数都可以用一个词来回答:@property(或者,在最后一种情况下,attrgetter)。其余的:

  • 控制生命周期和内存管理...... Python具有托管内存。
  • 提供调试拦截点... 解释语言可以在调试时轻松放置观察点。
  • 改进了与库的互操作性...... Python的mockpickle等设计用于操作属性。
  • 允许继承者通过覆盖getter / setter方法来更改属性的行为和语义的语义。 这仅适用于静态类型的语言,但虚拟函数除外,如C ++或Java。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

通常在Python中我们只使用普通的属性访问。如果您以后决定需要“getters”和“setter”,则可以轻松将其转换为properties。您不需要为了“以防万一”而混淆代码

对我而言,一个重要的一点就是you don't need to change any code that uses the class当你这样做时。