【问题标题】:Best practice - accessing object variables最佳实践 - 访问对象变量
【发布时间】:2012-07-31 06:24:22
【问题描述】:

我最近做了很多 Python 类,我通常只是像这样访问实例变量:

object.variable_name

但我经常看到来自其他模块的对象会使用包装器方法来访问这样的变量:

object.getVariable()

这些不同方法的优点/缺点是什么?是否有普遍接受的最佳做法(即使有例外)?

【问题讨论】:

    标签: python class variables methods


    【解决方案1】:

    在 Python 中永远不需要使用方法调用来获取属性。写这篇文章的人可能是前 Java 程序员,这是惯用的。

    在 Python 中,直接访问属性被认为是合适的。 如果您在访问属性时需要运行一些代码,例如动态计算它,您应该使用@property 装饰器。

    【讨论】:

    • @jonathan topf -- 不,不是那个,这个! :-)
    • 你的确实是这个问题的pythonic答案。我的回答比较笼统。先生,请给我一票。
    • 直接访问以及 getter/setter 属性的问题在于它变成了对象 API,并且经常暴露其当前实现的内部工作原理。如果这些不太可能改变或没有很多客户,那很好,但除此之外,许多人认为这是一种糟糕的面向对象编程实践。恕我直言,属性通常只是稍后添加的拐杖,以使事情在代码开始演变时仍能正常工作,这通常是这种情况。
    • @martineau 在 Python 视图中,如果它在概念上是一个成员变量,那么它应该看起来像一个 ("Readability counts.")。由于大多数 getter 和 setter 除了获取或设置之外什么都不做,普通变量不仅更清晰而且更简单 ("Simple is better than complex.")。如果你真的需要干预(例如强制约束),@property 允许。长话短说:不要在 Python 中使用 getX()setX() 函数。
    • @Lutz:就此而言,我并不是提倡使用 getter/setter 方法……也不是属性。前者和直接访问的主要问题是它们没有提供太多或任何encapsulation 组件,因此相对脆弱。
    【解决方案2】:

    在我看来,“getter”(getVariable 形式)的主要优点是在不更改签名的情况下添加功能或改进对象要容易得多。

    例如,假设我的对象从实现某些功能变为封装另一个对象并通过代理模式(组合)提供相同的功能。如果我使用 getter 来访问属性,那么从哪里获取该属性并不重要,并且使用您的代码的“客户”看不到任何变化。

    我使用 getter 和此类方法,尤其是当我的代码被其他人重用时(例如作为库)。当我的代码是独立的时,我就不那么挑剔了。

    在 Java 中,这几乎是一项要求,您永远不应该直接访问您的对象字段。在 Python 中这样做是完全合法的,但您可能会考虑到我提到的封装可能带来的好处。请记住,直接访问在 Python 中被认为是不好的形式,相反。

    【讨论】:

    • 在 Python 中,当您从简单的属性变为 getter/setter 时,您不必更改 API(使用 @property 装饰器 instad)。在其他语言(Java、C++)中,这是一个有效的参数。仍然有些人可能会争辩说这是不好的风格,不够明确/出乎意料的行为来处理属性访问。
    • 我同意 Daniel 的观点,即像在 Java 中那样定义 getter 并不是 Python 式的。
    【解决方案3】:

    制作 getVariable() 和 setVariable() 方法称为封装。 这种做法有很多优点,是面向对象编程中的首选风格。

    通过方法访问变量,您可以添加另一层“错误检查/处理”,确保您尝试设置/获取的值是正确的。

    setter 方法还用于其他任务,例如通知侦听器变量已更改。

    至少在java/c#/c++等中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      相关资源
      最近更新 更多