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

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

详解Python对象属性相关推荐

  1. 详解 Python 源码之对象机制

    在Python中,对象就是在堆上申请的结构体,对象不能是被静态初始化的,并且也不能是在栈空间上生存的.唯一的例外就是类型对象(type object),Python中所有的类型对象都是被静态初始化的. ...

  2. pythonnamedtuple定义类型_详解Python中namedtuple的使用

    namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: na ...

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

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

  4. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  5. python调用cmd命令释放端口_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  6. python中groupby()函数讲解与示例_详解python中groupby函数通俗易懂

    一.groupby 能做什么? python中groupby函数主要的作用是进行数据的分组以及分组后地组内运算! 对于数据的分组和分组运算主要是指groupby函数的应用,具体函数的规则如下: df[ ...

  7. python 线程安全的数据类型_详解python多线程、锁、event事件机制的简单使用

    详解python多线程.锁.event事件机制的简单使用 发布时间:2020-09-25 02:04:12 来源:脚本之家 阅读:117 作者:君惜 线程和进程 1.线程共享创建它的进程的地址空间,进 ...

  8. python的装饰器迭代器与生成器_详解python中的生成器、迭代器、闭包、装饰器

    迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1|1可迭代对象 以直接作用于 for ...

  9. 详解Python的装饰器

    详解Python的装饰器 Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye( ...

最新文章

  1. 三种组播×××承载方案对比
  2. jQuery 事件用法详解
  3. Shell脚本使用常见问题说明
  4. 在Ubuntu14.04上安装UberWriterMarkdown编辑器
  5. [mybatis]映射文件_select_返回集合(List,Map)
  6. Docker快速搭建邮件服务器Modoboa
  7. linux 安装源码网卡包,【linux命令】Linux通过yum 或者源码编译安装vnstat查看网卡流量...
  8. 一致性哈希算法 应用场景
  9. 基于 Vue BootStrap的迷你Chrome插件
  10. CodeReview 常见代码问题( 上 )
  11. 递归统计项目中的非空白代码行数
  12. python将缺失值用0代替_平滑而不使用零填充缺失值
  13. Atitit 存储与数据库性能调优流程目录1. 数据库出现性能瓶颈,对外表现有几个方面:
  14. 一些自用的编程工具推荐
  15. UFO提示写日志文件ufoerr.log 错误
  16. stack corruption detected问题探究
  17. vue中watch的详解
  18. Java 基于mail.jar 和 activation.jar 封装的邮件发送工具类
  19. 网络不通使用的PING命令是用的什么协议?
  20. Linux内核如何替换内核函数并调用原始函数

热门文章

  1. e2 android,魅蓝E2做工怎么样?魅蓝手机E2拆机全过程图解
  2. html语言创建无序列表的标记是,【HTML】 三、文档设置标记
  3. pp2使用需要java_新GRE模考软件POWERPREP2安装和使用说明(图解)
  4. linux脚本能轮循吗,通过Linux定时任务实现定时轮询数据库及发送Http请求
  5. listview item里面的控件点击事件
  6. 基于JAVA+SpringBoot+Vue+Mybatis+MYSQL的汽车销售管理系统
  7. 基于JAVA+SpringMVC+MYSQL的医院后勤管理系统
  8. Android8.1源码编译实践(Mac)
  9. Git应用之eclipse解决冲突代码
  10. 路飞学城Python-Day75