【发布时间】:2012-07-31 06:24:22
【问题描述】:
我最近做了很多 Python 类,我通常只是像这样访问实例变量:
object.variable_name
但我经常看到来自其他模块的对象会使用包装器方法来访问这样的变量:
object.getVariable()
这些不同方法的优点/缺点是什么?是否有普遍接受的最佳做法(即使有例外)?
【问题讨论】:
标签: python class variables methods
我最近做了很多 Python 类,我通常只是像这样访问实例变量:
object.variable_name
但我经常看到来自其他模块的对象会使用包装器方法来访问这样的变量:
object.getVariable()
这些不同方法的优点/缺点是什么?是否有普遍接受的最佳做法(即使有例外)?
【问题讨论】:
标签: python class variables methods
在 Python 中永远不需要使用方法调用来获取属性。写这篇文章的人可能是前 Java 程序员,这是惯用的。
在 Python 中,直接访问属性被认为是合适的。
如果您在访问属性时需要运行一些代码,例如动态计算它,您应该使用@property 装饰器。
【讨论】:
@property 允许。长话短说:不要在 Python 中使用 getX() 或 setX() 函数。
在我看来,“getter”(getVariable 形式)的主要优点是在不更改签名的情况下添加功能或改进对象要容易得多。
例如,假设我的对象从实现某些功能变为封装另一个对象并通过代理模式(组合)提供相同的功能。如果我使用 getter 来访问属性,那么从哪里获取该属性并不重要,并且使用您的代码的“客户”看不到任何变化。
我使用 getter 和此类方法,尤其是当我的代码被其他人重用时(例如作为库)。当我的代码是独立的时,我就不那么挑剔了。
在 Java 中,这几乎是一项要求,您永远不应该直接访问您的对象字段。在 Python 中这样做是完全合法的,但您可能会考虑到我提到的封装可能带来的好处。请记住,直接访问在 Python 中不被认为是不好的形式,相反。
【讨论】:
制作 getVariable() 和 setVariable() 方法称为封装。 这种做法有很多优点,是面向对象编程中的首选风格。
通过方法访问变量,您可以添加另一层“错误检查/处理”,确保您尝试设置/获取的值是正确的。
setter 方法还用于其他任务,例如通知侦听器变量已更改。
至少在java/c#/c++等中。
【讨论】: