使用@property与getter和setter
@property
这种写法相比于传统的getter和setter有什么好处呢?在什么情况下程序员应该选择使用其中一种呢?
使用属性时:
class MyClass(object):
@property
def my_attr(self):
return self._my_attr
@my_attr.setter
def my_attr(self, value):
self._my_attr = value
不使用属性时:
class MyClass(object):
def get_my_attr(self):
return self._my_attr
def set_my_attr(self, value):
self._my_attr = value
13 个回答
125
使用属性可以让你先从普通的属性访问开始,然后在需要的时候再用获取器和设置器来支持它们。
176
在Python中,你并不是为了好玩才使用获取器(getters)、设置器(setters)或属性(properties)。一开始你只需要用属性,如果后面有需要,再把它改成属性,这样使用你写的类的代码就不用改动。
确实,有很多扩展名为.py的代码使用了获取器、设置器、继承和一些没必要的类,其实用一个简单的元组就能解决,但这些代码是那些习惯用C++或Java的人写的,结果在Python中也这么写。
这可不是Python的写法。
662
优先使用属性。这就是它们存在的意义。
原因是,在Python中,所有的属性都是公开的。属性名如果以一个或两个下划线开头,只是提醒你这个属性可能是实现细节,未来的代码版本中可能会有变化。这并不意味着你不能访问或设置这个属性。因此,正常访问属性的方式就是Python推荐的方式。
使用属性的好处是,它们在语法上和直接访问属性是一样的,所以你可以在不改变使用代码的情况下,从一种方式切换到另一种方式。你甚至可以有一个版本的类使用属性(比如为了契约编程或调试),另一个版本在生产环境中不使用,而不需要修改使用这个类的代码。同时,你也不需要为每个属性都写获取器和设置器,以防将来需要更好地控制访问。