python:为什么getter&

python: why getter & setter? how can I set attribute quickly?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is the benefit to using a ‘get function’ for a python class?

我刚开始读python,但我想知道为什么python需要setter和getter?它已经有了类似于属性的对象变量

考虑

1
2
3
4
5
6
7
8
9
10
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"来做我们想做的吗?财产的好处是什么?

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

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


使用普通属性:

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

稍后,如果需要,可以将X更改为属性。"@property"的优点是允许开发者不使用getter、setter和"@property"。


您可以使用property获得您想要的:

1
2
3
4
5
6
7
8
9
10
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

然后,可以使用常用的属性语法访问属性:

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

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

  • 您可以记录属性
  • 您可以通过使属性为只读或检查正在设置的类型/值来控制对该属性的访问。
  • 您不会破坏向后兼容性:如果某个东西是一个普通的实例属性,然后您决定将它转换为一个属性,那么使用该属性的代码仍然可以工作。如果使用get/set显式方法,则使用旧API的所有代码都必须更改
  • 它比使用显式get/set方法更具可读性。


1
2
3
4
5
6
7
8
9
10
11
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",并透明地获取。

集合和getter的目的是不公开类内部。

想象一下未来

1
self._x

更改为

1
sql.save(id(self), value)

然后让你去:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
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)