你使用get / set模式(在Python中)吗?

时间:2010-04-05 17:26:20

标签: python getter-setter

使用get / set似乎是Java中的常见做法(出于各种原因),但我几乎看不到使用它的Python代码。

为什么在Python中使用或避免使用get / set方法?

7 个答案:

答案 0 :(得分:106)

在python中,您可以直接访问该属性,因为它是公共的:

class MyClass:

    def __init__(self):
        self.my_attribute = 0  

my_object = MyClass()
my_object.my_attribute = 1 # etc.

如果您想对属性的访问或变异做些什么,可以使用properties

class MyClass:

    def __init__(self):
        self._my_attribute = 0

    @property
    def my_attribute(self):
        # Do something if you want
        return self._my_attribute

    @my_attribute.setter
    def my_attribute(self, value):
        # Do something if you want
        self._my_attribute = value

至关重要的是,客户端代码保持不变。

答案 1 :(得分:52)

酷链接:Python is not Java:)

  

在Java中,你必须使用getter和setter,因为使用公共字段使你没有机会回过头来改变主意,使用getter和setter。所以在Java中,你可能也会提前做好准备工作。在Python中,这很愚蠢,因为您可以从普通属性开始并随时改变主意,而不会影响该类的任何客户端。所以,不要写getter和setter。

答案 2 :(得分:26)

以下是Guido van Rossum在Masterminds of Programming

中所说的内容
  

“打架语言”是什么意思?

     

Guido:这通常意味着他们是   试图继续他们的习惯   用不同的语言很好地工作。

     

[...]人们会把一切都变成   一个类,并将每个访问权转变为一个   存取方法,
  在Python中,这真的不是明智之举;   你会有更详细的代码   更难调试,运行速度慢很多。   你知道“你可以写的表达”   任何语言的FORTRAN?“你也可以用任何语言编写Java。

答案 3 :(得分:13)

不,这是unpythonic。普遍接受的方法是使用普通数据属性,并用属性替换那些需要更复杂的获取/设置逻辑的属性。

答案 4 :(得分:6)

您的问题的简短答案是否定的,您应该在需要时使用属性。 Ryan Tamyoko在他的文章Getters/Setters/Fuxors

中提供了长篇答案
  

要消除这一切的基本价值是你要努力确保每一行代码对程序员都有一定的价值或意义。编程语言适用于人类,而不适用于机器。如果你的代码看起来没有做任何有用的东西,很难阅读,或者看起来很乏味,那么很可能Python有一些语言功能可以让你删除它。

答案 5 :(得分:5)

你的观察是正确的。这不是Python编程的常规风格。属性都是公共的,因此您只需访问(获取,设置,删除)它们,就像使用包含它们的任何对象(不仅仅是类或实例)的属性一样。很容易判断Java程序员何时学习Python,因为他们的Python代码看起来像使用Python语法的Java!

我绝对同意所有以前的海报,尤其是@Maximiliano链接到Phillip的着名文章 @Max的建议,即比设置(和获取)类和实例属性的标准方法更复杂的是使用属性(或描述符进一步概括)来自定义属性的获取和设置! (这包括能够添加您自己的私人,受保护,朋友或任何您想要的政策的定制版本,如果您需要除公开之外的其他内容。)

作为一个有趣的演示,在 Core Python Programming (第13章,第13.16节)中,我想出了一个使用描述符将属性存储到磁盘而不是内存中的示例!是的,这是一种奇怪的持久存储形式,但它确实向您展示了可能的存储示例!

以下是您可能会觉得有用的另一篇相关文章: Python: multiple properties, one setter/getter

答案 6 :(得分:-8)

我们的老师在课堂上展示了一个例子,说明何时应该使用访问器功能。

class Woman(Human):
    def getAge(self):
        if self.age > 30:
            return super().getAge() - 10
        else:
            return super().getAge()