详解Python对象属性
在面向对象编程中,公开的数据成员可以在外部随意访问和修改,很难控制用户修改时新数据的合法性。解决这一问题的常用方法是定义私有数据成员,然后设计公开的成员方法来提供对私有数据成员的读取和修改操作,修改私有数据成员时可以对值进行合法性检查,提高了程序的健壮性,保证了数据的完整性。属性结合了公开数据成员和成员方法的优点,既可以像成员方法那样对值进行必要的检查,又可以像数据成员一样灵活的访问。
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对象属性相关推荐
- 详解 Python 源码之对象机制
在Python中,对象就是在堆上申请的结构体,对象不能是被静态初始化的,并且也不能是在栈空间上生存的.唯一的例外就是类型对象(type object),Python中所有的类型对象都是被静态初始化的. ...
- pythonnamedtuple定义类型_详解Python中namedtuple的使用
namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: na ...
- python getattr_详解 Python 的二元算术运算,为什么说减法只是语法糖?
原题 | Unravelling binary arithmetic operations in Python 作者 | Brett Cannon 译者 | 豌豆花下猫("Python猫&q ...
- python策略模式包含角色_详解Python设计模式之策略模式
虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...
- python调用cmd命令释放端口_详解python调用cmd命令三种方法
目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...
- python中groupby()函数讲解与示例_详解python中groupby函数通俗易懂
一.groupby 能做什么? python中groupby函数主要的作用是进行数据的分组以及分组后地组内运算! 对于数据的分组和分组运算主要是指groupby函数的应用,具体函数的规则如下: df[ ...
- python 线程安全的数据类型_详解python多线程、锁、event事件机制的简单使用
详解python多线程.锁.event事件机制的简单使用 发布时间:2020-09-25 02:04:12 来源:脚本之家 阅读:117 作者:君惜 线程和进程 1.线程共享创建它的进程的地址空间,进 ...
- python的装饰器迭代器与生成器_详解python中的生成器、迭代器、闭包、装饰器
迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1|1可迭代对象 以直接作用于 for ...
- 详解Python的装饰器
详解Python的装饰器 Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye( ...
最新文章
- 三种组播×××承载方案对比
- jQuery 事件用法详解
- Shell脚本使用常见问题说明
- 在Ubuntu14.04上安装UberWriterMarkdown编辑器
- [mybatis]映射文件_select_返回集合(List,Map)
- Docker快速搭建邮件服务器Modoboa
- linux 安装源码网卡包,【linux命令】Linux通过yum 或者源码编译安装vnstat查看网卡流量...
- 一致性哈希算法 应用场景
- 基于 Vue BootStrap的迷你Chrome插件
- CodeReview 常见代码问题( 上 )
- 递归统计项目中的非空白代码行数
- python将缺失值用0代替_平滑而不使用零填充缺失值
- Atitit 存储与数据库性能调优流程目录1. 数据库出现性能瓶颈,对外表现有几个方面:
- 一些自用的编程工具推荐
- UFO提示写日志文件ufoerr.log 错误
- stack corruption detected问题探究
- vue中watch的详解
- Java 基于mail.jar 和 activation.jar 封装的邮件发送工具类
- 网络不通使用的PING命令是用的什么协议?
- Linux内核如何替换内核函数并调用原始函数
热门文章
- e2 android,魅蓝E2做工怎么样?魅蓝手机E2拆机全过程图解
- html语言创建无序列表的标记是,【HTML】 三、文档设置标记
- pp2使用需要java_新GRE模考软件POWERPREP2安装和使用说明(图解)
- linux脚本能轮循吗,通过Linux定时任务实现定时轮询数据库及发送Http请求
- listview item里面的控件点击事件
- 基于JAVA+SpringBoot+Vue+Mybatis+MYSQL的汽车销售管理系统
- 基于JAVA+SpringMVC+MYSQL的医院后勤管理系统
- Android8.1源码编译实践(Mac)
- Git应用之eclipse解决冲突代码
- 路飞学城Python-Day75