python:为什么getter&设定装置?我怎样才能快速设置属性?

时间:2012-12-25 06:10:51

标签: python setter getter

  

可能重复:
  What is the benefit to using a ‘get function’ for a python class?

我刚刚开始阅读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)

我们可以只使用C.x =“value”来做我们想做的事吗?财产的好处是什么?

顺便说一下,用这种方式创建属性/ setter / getter对我来说很麻烦,有什么方法可以简化这个吗?喜欢

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

3 个答案:

答案 0 :(得分:3)

您可以使用property获取所需内容:

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方法更具可读性。

答案 1 :(得分:3)

使用普通属性:

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

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

答案 2 :(得分: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)

现在你可以使用c.x =“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)