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

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

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

酷链接: Python不是Java 🙂

在Java中,你必须使用getter和setter,因为使用公共字段给你没有机会回头,稍后改变主意使用getter和setter。 所以在Java中,你也可以把事情摆在前面。 在Python中,这是愚蠢的,因为你可以从一个正常的属性开始,随时改变主意,而不会影响任何类的客户端。 所以,不要写getter和setter。

在Python中,你可以直接访问属性,因为它是公共的:

class MyClass(object): def __init__(self): self.my_attribute = 0 my_object = MyClass() my_object.my_attribute = 1 # etc. 

如果您想要对属性进行访问或变异,可以使用属性 :

 class MyClass(object): 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 

关键的是,客户端代码保持不变。

这就是Guido van Rossum在“程序devise大师”(Masterminds of Programming)中所说

你的意思是“与语言作斗争”?

圭多:这通常意味着他们试图继续使用不同语言的良好习惯。

人们会把所有东西都变成一个类,把每个访问都变成一个访问方法,
这在Python中确实不是一件明智的事情; 你会有更详细的代码是
难以debugging,运行速度较慢。 你知道expression“你可以写任何语言的FORTRAN?” 你也可以用任何语言编写Java。

不,它是和谐的。 普遍接受的方法是使用正常的数据属性,并将需要更复杂的获取/设置逻辑的属性replace为属性。

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

我绝对同意以前所有的海报,特别是@Maximiliano与Phillip着名文章的联系, 以及 @Max的build议,任何比设置(和获取)类和实例属性更为复杂的build议是使用属性(或描述符来进一步概括)自定义属性的获取和设置! (这包括能够添加自己的私人定制版本,受保护的,朋友的,或任何你想要的政策,如果你想要的东西以外的公共。

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

下面是另外一个相关的post,你可能会觉得很有用: Python:多个属性,一个setter / getter

你的问题的简短答案是否定的,你应该在需要时使用属性。 Ryan Tamyoko在他的文章Getters / Setters / Fuxors中提供了很长的回答

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

我们的老师在课上讲解了一个例子,说明什么时候应该使用访问函数。

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