协慌网

登录 贡献 社区

使用 @property 与 getter 和 setter

这是一个纯 Python 特定的设计问题:

class MyClass(object):
    ...
    def get_my_attr(self):
        ...

    def set_my_attr(self, value):
        ...

class MyClass(object):
    ...        
    @property
    def my_attr(self):
        ...

    @my_attr.setter
    def my_attr(self, value):
        ...

Python 让我们可以以任何一种方式进行操作。如果要设计一个 Python 程序,将使用哪种方法,为什么?

答案

首选属性。这就是他们在那里的目的。

原因是所有属性在 Python 中都是公共的。以一两个下划线开头的名称只是警告,给定的属性是实现的详细信息,在将来的代码版本中可能会保持不变。它不会阻止您实际获取或设置该属性。因此,标准属性访问是访问属性的常规 Python 方式。

属性的优点是它们在语法上与属性访问相同,因此您可以在不更改客户端代码的情况下从一个属性更改为另一个属性。您甚至可以拥有使用属性的类的一个版本(例如,用于按合同进行代码或调试),而不用于生产的版本,而无需更改使用该属性的代码。同时,您不必为所有内容编写 getter 和 setter,以防万一您以后可能需要更好地控制访问。

在 Python 中,您不会仅仅为了获得乐趣而使用 getter 或 setter 或属性。您首先只使用属性,然后,仅在需要时才最终将其迁移到属性,而不必使用类来更改代码。

确实有很多扩展名为. py 的代码,它们在任何地方(例如,简单的元组)都可以使用 getter 和 setters 以及继承和无意义的类,但这是人们使用 Python 用 C ++ 或 Java 编写的。

那不是 Python 代码。

使用属性可以使您从普通的属性访问开始,然后根据需要使用 getter 和 setter 对其进行备份