Python面向对象程序设计中属性的作用与用法

2017-01-18 董付国 Python小屋 Python小屋

公开的数据成员可以在外部随意访问和修改,很难保证用户进行修改时提供新数据的合法性,数据很容易被破坏,并且也不符合类的封装性要求。解决这一问题的常用方法是定义私有数据成员,然后设计公开的成员方法来提供对私有数据成员的读取和修改操作,修改私有数据成员之前可以对值进行合法性检查,提高了程序的健壮性,保证了数据的完整性。属性是一种特殊形式的成员方法,结合了公开数据成员和成员方法的优点,既可以像成员方法那样对值进行必要的检查,又可以像数据成员一样灵活的访问。

Python 2.x中对象属性并没有提供太多保护机制,存在一些问题。在Python 3.x中属性得到了较为完整的实现,支持更加全面的保护机制。如果设置属性为只读,则无法修改其值,也无法为对象增加与属性同名的新成员,当然也无法删除对象属性。

下面的演示代码将属性设置为可读、可修改、可删除,如果不指定删除操作的方法将无法删除该属性,同理,如果不指定修改操作的方法则无法对属性的值进行修改。
>>> class Test:
    def __init__(self, value):
        self.__value = value

    def __get(self):
        return self.__value

    def __set(self, v):
        self.__value = v

   #删除对象的私有数据成员

    def __del(self):
        del self.__value

   #可读、可写、可删除的属性

    value = property(__get, __set, __del)

    def show(self):
        print(self.__value)
>>> t = Test(3)
>>> t.show()
3
>>> t.value
3
>>> t.value = 5
>>> t.show()
5
>>> t.value
5
>>> del t.value
>>> t.value  #相应的私有数据成员已删除,访问失败
AttributeError: 'Test' object has no attribute '_Test__value'

>>> t.show()
AttributeError: 'Test' object has no attribute '_Test__value'
>>> t.value =1 #动态增加属性和对应的私有数据成员
>>> t.show()
1
>>> t.value
1