其他分享
首页 > 其他分享> > 我应该使用属性还是getter和setter方法?

我应该使用属性还是getter和setter方法?

作者:互联网

我知道在python中使用getter和setters不是pythonic.应该使用属性装饰器.但是我想知道以下情况-

我有一个用一些实例属性初始化的类.然后,稍后我需要向该类添加其他实例属性.如果不使用设置器,则必须在类外的任何地方编写object.attribute = value.该类将没有self.attribute代码.当我需要跟踪类的属性时(因为它们散布在类外部的代码中),这不会成为问题吗?

解决方法:

通常,您甚至都不应该使用属性.简单属性在大多数情况下都可以正常工作:

class X:
    pass
>>> x = X()
>>> x.a
Traceback (most recent call last):
  # ... etc
AttributeError: 'X' object has no attribute 'a'
>>> x.a = 'foo'
>>> x.a
'foo'

只有在访问属性时需要做一些工作时,才应使用属性:

import random

class X:

    @property
    def a(self):
        return random.random()
>>> x = X()
>>> x.a
0.8467160913203089

如果还需要能够分配给属性,则定义一个setter很简单:

class X:

    @property
    def a(self):
        # do something clever
        return self._a

    @a.setter
    def a(self, value):
        # do something even cleverer
        self._a = value
>>> x = X()
>>> x.a
Traceback (most recent call last):
  # ... etc
AttributeError: 'X' object has no attribute '_a'
>>> x.a = 'foo'
>>> x.a
'foo'

请注意,在每种情况下,客户端代码访问属性或属性的方式都是完全相同的.无需为类提供“面向未来的”功能,以免在某些时候您可能想要做的事情比简单的属性访问更为复杂,因此除非您现在确实需要它们,否则没有理由编写属性,getter或setter.

有关特性,getter和setter的惯用Python与其他语言之间的区别的更多信息,请参见:

> Why don’t you want getters and setters?
> Python is not Java(尤其是“字母和字母的设置是邪恶的”部分)

标签:properties,python-3-x,getter-setter,python
来源: https://codeday.me/bug/20191026/1933123.html