1

可能重复:
对 python 类使用“get 函数”有什么好处?

我刚开始阅读 Python,但我想知道为什么 Python 需要 setter 和 getter?它已经有像属性一样的对象变量

考虑

class C(object):
    def _init_(self):
        self._x = None

    def get_x(self):
        return self._x

    def set_x(self, value):
        self._x = valu
    x = property(get_x, set_x)

我们可以在这里使用 Cx = "value" 来做我们想做的事情吗?财产有什么好处?

顺便说一句,以这种方式创建属性/设置器/获取器对我来说很麻烦,有没有办法简化这个?喜欢

class C()
   has_attributes("x", "y", "z")
4

3 回答 3

4

使用普通属性:

class C(object):
    def __init__(self):
        self.x = None

稍后,如果有必要,可以将 x 更改为属性。“@property”的美妙之处在于它允许开发人员不使用 getter、setter 和“@property”。

于 2012-12-25T07:29:54.657 回答
3

你可以使用 aproperty来获得你想要的:

class C(object):
    def _init_(self):
        self._x = None
    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

然后您可以使用通常的属性语法访问该属性:

c = C()
c.x = 10    #calls the setter
print(c.x)  #calls the getter

使用属性而不是普通数据属性有一些原因:

  • 您可以记录属性
  • 您可以通过将其设为只读或检查设置的类型/值来控制对属性的访问
  • 您不会破坏向后兼容性:如果某物是普通的实例属性,然后您决定将其转换为属性,则使用该属性的代码仍然可以工作。如果您使用 get/set 显式方法,则所有使用旧 API 的代码都必须更改
  • 它比使用显式的 get/set 方法更具可读性。
于 2012-12-25T06:33:31.993 回答
2
class C(object):
    def _init_(self):
        self._x = None

    def get_x(self):
        return self._x

    def set_x(self, value):
        self._x = value

    x = property(get_x, set_x)

现在您可以透明地使用 cx = "foo" 和 set 并获取。

set 和 getter 的目的是不暴露类内部。

想象一下,在未来

self._x 

更改为

sql.save(id(self), value)

和 get_x 到:

value= sql.sql(id(self))
return convertFromDbFormatToExpectedApiFormat(value)

您只需要更改该类中的 getter 和 setter 代码,而不需要更改与其通信的所有类。

class C(object):
    def _init_(self):
        self.sql = DDBB()

    def get_x(self):
        dbregistry = self.sql.fetch(id(self))
        return convertFromDbFormatToExpectedApiFormat(dbregistry)

    def set_x(self, value):
        self.sql.save(id(self), value)

    x = property(get_x, set_x)
于 2012-12-25T06:33:04.237 回答