在面向对象编程中,公开的数据成员可以在外部随意访问和修改,很难控制用户修改时新数据的合法性。解决这一问题的常用方法是定义私有数据成员,然后设计公开的成员方法来提供对私有数据成员的读取和修改操作,修改私有数据成员时可以对值进行合法性检查,提高了程序的健壮性,保证了数据的完整性。属性结合了公开数据成员和成员方法的优点,既可以像成员方法那样对值进行必要的检查,又可以像数据成员一样灵活的访问。

Python 2.x中属性的实现有很多不如人意的地方,在Python 3.x中,属性得到了较为完整的实现,支持更加全面的保护机制。如果设置属性为只读,则无法修改其值,也无法为对象增加与属性同名的新成员,同时,也无法删除对象属性。例如:

>>> class Test:

    def __init__(self, value):

        self.__value = value  #私有数据成员

    @property  #修饰器,定义属性,提供对私有数据成员的访问

    def value(self):   #只读属性,无法修改和删除

        return self.__value

>>> t = Test(3)

>>> t.value

3

>>> t.value = 5   #只读属性不允许修改值

Traceback (most recent call last):

  File "<pyshell#151>", line 1, in <module>

    t.value = 5

AttributeError: can't set attribute

>>> t.v=5   #动态增加新成员

>>> t.v

5

>>> del t.v #动态删除成员

>>> del t.value  #试图删除对象属性,失败

Traceback (most recent call last):

  File "<pyshell#152>", line 1, in <module>

    del t.value

AttributeError: can't delete attribute

>>> t.value

3

下面的代码则把属性设置为可读、可修改,而不允许删除。

>>> class Test:

    def __init__(self, value):

        self.__value = value    

    def __get(self):   #读取私有数据成员的值

        return self.__value

    def __set(self, v): #修改私有数据成员的值

        self.__value = v

    value = property(__get, __set)  #可读可写属性,指定相应的读写方法

    def show(self):

        print(self.__value)

>>> t = Test(3)

>>> t.value #允许读取属性值

3

>>> t.value = 5   #允许修改属性值

>>> t.value

5

>>> t.show()  #属性对应的私有变量也得到了相应的修改

5

>>> del t.value  #试图删除属性,失败

Traceback (most recent call last):

  File "<pyshell#152>", line 1, in <module>

    del t.value

AttributeError: can't delete attribute

当然,也可以将属性设置为可读、可修改、可删除。

>>> 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  #相应的私有数据成员已删除,访问失败

Traceback (most recent call last):

  File "<pyshell#165>", line 1, in <module>

    t.value

  File "<pyshell#157>", line 6, in __get

    return self.__value

AttributeError: 'Test' object has no attribute '_Test__value'

>>> t.show()

Traceback (most recent call last):

  File "<pyshell#166>", line 1, in <module>

    t.show()

  File "<pyshell#157>", line 17, in show

    print(self.__value)

AttributeError: 'Test' object has no attribute '_Test__value'

>>> t.value =1  #为对象动态增加属性和对应的私有数据成员

>>> t.show()

1

>>> t.value

1

稿源:微信定制开发www1.qixoo.com

详解Python对象属性的更多相关文章

  1. 详解Python中内置的NotImplemented类型的用法

    它是什么? ? 1 2 >>> type(NotImplemented) <type 'NotImplementedType'> NotImplemented 是Pyth ...

  2. 详解python的装饰器decorator

    装饰器本质上是一个python函数,它可以让其它函数在不需要任何代码改动的情况下增加额外的功能. 装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志,性能测试,事务处理,缓存, ...

  3. 详解 Python 的二元算术运算,为什么说减法只是语法糖?

    原题 | Unravelling binary arithmetic operations in Python 作者 | Brett Cannon 译者 | 豌豆花下猫("Python猫&q ...

  4. dom对象详解--document对象(二)

       dom对象详解--style对象 style对象 style对象和document对象下的集合对象styleSheets有关系,styleSheets是文档中所有style对象的集合,这里讲解的 ...

  5. dom对象详解--document对象(一)

     document对象 Document对象代表整个html文档,可用来访问页面中的所有元素,是最复杂的一个dom对象,可以说是学习好dom编程的关键所在. Document对象是window对象的一 ...

  6. js对象详解(JavaScript对象深度剖析,深度理解js对象)

    js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕 ...

  7. Struts功能详解——ActionMapping对象

    Struts功能详解——ActionMapping对象 ActionMapping描述了struts中用户请求路径和Action的映射关系,在struts中每个ActionMapping都是通过pat ...

  8. php开发面试题---php面向对象详解(对象的主要三个特性)

    php开发面试题---php面向对象详解(对象的主要三个特性) 一.总结 一句话总结: 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸 ...

  9. 详解Python编程中基本的数学计算使用

    详解Python编程中基本的数学计算使用 在Python中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯 ...

随机推荐

  1. 使用EXISTS语句注意点

    1.使用EXISTS语句,其目标列一般用“*”,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义. 2.使用EXISTS语句一定要注意上下两个表之间要建立联系. 例如,查询所有选修了1号 ...

  2. P1195 口袋的天空

    P1195 口袋的天空 题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关 ...

  3. Edittext焦点处理

    <LinearLayout android:focusable="true" android:layout_width="0dp" android:lay ...

  4. Qt写入txt文件方法

    void MainWindow::on_saveBtn_clicked() { //本函数只是单独测试Qt保持为txt文本功能,与本串口程序无任何关系 QDateTime da_time; QStri ...

  5. 掌握GCD以及后台永久运行的代码 (使用GCD处理后台线程和UI线程的交互)

    一个例子: 在iPhone上做一个下载网页的功能,就是:在iPhone上放一个按钮,单击按钮时,显示一个转动的圆圈,表示正在进行下载,下载完成后,将内容加载到界面上的一个文本控件上. 使用GCD前: ...

  6. 测试技能积木-AWK的简要用法

    做测试工作,经常要分析日志,有的时候活儿还很脏很累,比如抽取符合某些pattern的行,重新格式化等等.有的时候,我们需要也创造一些测试用数据文件.基于上述两种原因,在Unix Like 系统上,一些 ...

  7. 怎样写 OpenStack Neutron 的 Extension (一)

    前两篇文章讨论了怎么写一个 Neutron 的插件.但是最基本的插件只包括 Network, Port,和 Subnet 三种资源.如果需要引入新的资源,比如一个二层的 gateway 的话,就需要在 ...

  8. EntityFramework:值不能为 null。参数名: entitySet 异常解决方案

    昨天EF莫名其妙的,掉所有接口访问都出现如下错误:百度,Google了半天,倒是有很多人都遇到了这个问题,但都没有一个解决方案,或者解决方案无效.通过层层排除,终于找到问题的所在.记录下来,给以后再遇 ...

  9. Use Windows Azure AD to create SSO projects

    Keywords Windows Azure AD, SSO Summary Use Windows Azure AD to create SSO projects Detailed Scenario ...

  10. Fluent NHibernate关系映射

    1.好处:Fluent NHibernate让你不再需要去写NHibernate的标准映射文件(.hbm.xml), 方便了我们的代码重构,提供了代码的易读性,并精简了项目代码 实现: (1).首先我 ...