面向对象编程中我们经常需要获取或者设置对象的属性,可以有以下两种写法。

第一种,直接操作

class C(object):
    def __init__(self, x):
        self._x = x
c = C(10)
print(c._x)   #直接获取属性
c._x = 20     #直接设置属性

第二种,通过getter、setter

class C(object):
    def __init__(self, x):
        self._x = x
    def getx(self):
        return self._x
    def setx(self, x):
        self._x = x
c = C(10)
print(c.getx())   #通过getter函数
c.setx(20)        #通过setter函数

这两种方法中,明显第一种更简单直接。但是为什么还要有第二种方法呢?这是因为随着应用场景的变化,get和set会变得更复杂,比如需要统计get的次数,set的时候要设置最大值最小值等等,对第一种方法显然是很难适应这种需求。第二种方法就是所谓的数据封装

python中提供了property函数,可以让我们使用第一种的写法就达到第二种的效果。

class C(object):
    def __init__(self, x):
        self._x = x
    def getx(self):
        print("I am getx")
        return self._x
    def setx(self, x):
        print("I am setx")
        self._x = x
    x = property(getx, setx)
c = C(10)
print(c.x)      #会调用getx方法,打印"I am getx"
c.x = 20        #会调用setx方法,打印"I am setx"

用property函数,我们的代码就可以写得更简单,更优美,这也正好符合了python的哲学——Beautiful is better than ugly, Simple is better than complex.

comments powered by Disqus