在Python中使用使用@property与getter和setter


在Python中使用使用@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中的所有属性都是公共的。使用下划线或下划线的起始名称只是警告,给定属性是一个实现细节,在将来的代码版本中可能不会保持不变。它不会阻止您实际获取或设置该属性。因此,标准属性访问是访问属性的正常,Pythonic方式。

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

有时候为了做一些验证

def set_email(self, value):
    if '@' not in value:
        raise Exception("This doesn't look like an email address.")
    self._email = value

def get_email(self):
    return self._email

email = property(get_email, set_email)