我最近在Python上创建了很多类,我通常只访问这样的实例变量:
object.variable_name
但是我常常看到来自其他模块的对象会使包装器方法访问这样的变量:
object.getVariable()
这些不同方法有哪些优点/缺点,是否有普遍接受的最佳实践(即使有例外情况)?
答案 0 :(得分:11)
Python中永远不需要使用方法调用来获取属性。写这篇文章的人可能是前Java程序员,这是惯用的。
在Python中,直接访问属性被认为是正确的。
如果在访问属性时需要运行某些代码,例如动态计算它,则应使用@property
装饰器。
答案 1 :(得分:3)
我认为“getters”(getVariable
形式)的主要优点是,在不改变签名的情况下添加功能或改进对象要容易得多。
例如,假设我的对象从实现某些功能变为封装另一个对象,并通过代理模式(组合)提供相同的功能。如果我使用getter访问属性,那么获取该属性的位置并不重要,并且使用您的代码对“客户”不会发现任何变化。
我使用getter和这样的方法,特别是当我的代码被重用时(例如作为库),由其他人使用。当我的代码是自包含的时候,我就不那么挑剔了。
在Java中,这几乎是一项要求,您永远不应该直接访问您的对象字段。在Python中,这样做是完全合法的,但您可以考虑我提到的封装的可能好处。仍然要记住,相反,直接访问不被认为是Python中的错误形式。
答案 2 :(得分:0)
使getVariable()和setVariable()方法称为enncapsulation。 这种做法有许多优点,它是面向对象编程中的优先风格。
通过方法访问变量,您可以通过确保您尝试设置/获取的值是正确的来添加另一层“错误检查/处理”。
setter方法还用于其他任务,例如通知侦听器变量已更改。
至少在java / c#/ c ++等中。