使用@property与getter和setter

798 投票
13 回答
488860 浏览
提问于 2025-04-16 21:03

@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推荐的方式。

使用属性的好处是,它们在语法上和直接访问属性是一样的,所以你可以在不改变使用代码的情况下,从一种方式切换到另一种方式。你甚至可以有一个版本的类使用属性(比如为了契约编程或调试),另一个版本在生产环境中不使用,而不需要修改使用这个类的代码。同时,你也不需要为每个属性都写获取器和设置器,以防将来需要更好地控制访问。

撰写回答