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

Ave*_*yne 75 python getter-setter

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

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

blo*_*ley 108

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

class MyClass:

    def __init__(self):
        self.my_attribute = 0  

my_object = MyClass()
my_object.my_attribute = 1 # etc.
Run Code Online (Sandbox Code Playgroud)

如果要对属性的访问或变异执行某些操作,可以使用属性:

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
Run Code Online (Sandbox Code Playgroud)

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


mgv*_*mgv 53

酷链接:Python不是Java :)

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

  • @Nick D:我不认为访问者是在Python中进行速度优化的正确位置. (8认同)
  • 这*会给类设计者带来额外的负担,因为实例变量隐式地成为类的公共API的一部分.在布置类时,请明确考虑外部访问哪些实例变量与实际只是类实现的一部分.使用前导'_'作为内部实现的前缀.这是Python警告标志,如果实现发生变化,这个变量可能会改变甚至完全消失.否则你会发现你的课程漏掉了实施知识,以后很难改变. (4认同)
  • 加上setter/getters会增加性能成本,特别是在Python中. (3认同)
  • @Paul:它不是*一个内部属性,除非它以一个或两个前导下划线命名(第一种形式通常是首选,因为后者使用Python不寻常的名称修改).如果您不想编写文档并且此问题困扰您,则只需对所有实例属性使用_name. (2认同)

Nic*_*kis 27

以下是Guido van Rossum在Masterminds of Programming中所说的内容

"对抗语言"是什么意思?

Guido:这通常意味着他们试图继续使用不同语言的习惯.

[...]人们会将所有内容都变成一个类,并将每个访问转变为一个访问器方法,
这在Python中真的不是明智之举; 你将有更多冗长的代码,
更难调试,运行速度慢很多.你知道"你可以用任何语言写FORTRAN吗?" 您也可以使用任何语言编写Java.


Max*_*keh 14

不,这是unpythonic.普遍接受的方法是使用普通数据属性并用属性替换需要更复杂的get/set逻辑的属性.

  • +1:"我们都是成年人".代码是可见的.当看到所有代码时,"private"和"getter/setter"不会创建任何值. (12认同)

Sha*_*son 6

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

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


wes*_*cpy 5

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

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

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

这是另一篇你可能会觉得有用的相关文章: Python:多个属性,一个setter/getter