第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现
第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现
一、 案例说明
本节将通过一个案例介绍怎么使用property定义快捷的属性访问。案例中使用Rectangle类:
1、 在类内定义了两个私有属性长度和宽度self.__length、self.__width;
2、 定义了这两个属性的get方法getLen、getWidth;
3、 定义了一次返回这两个属性的get方法getSize,返回一个由长度和宽带值组成的元组,并为了跟踪执行轨迹在方法中输出了痕迹;
4、 定义了self.__length、self.__width的set方法setLen、setWidth,并为了跟踪执行轨迹在方法中输出了痕迹;
5、 定义了删除两个属性的方法delSize
6、 使用property分别将相关操作绑定了size、len、width属性,size支撑get、set和del,其他两个属性不支持del
size = property(getSize,setSize,delSize,'用元组存储的长方形的长和宽')
len = property(getLen,setLen,0,'长方形的长') #虽然执行效果一样,但参数中的0最好用None
width = property(getWidth,setWidth,0,'长方形的宽')
二、 案例代码(交互方式下逐句执行)
class Rectangle():
def __init__(self,length,width): self.__width,self.__length = width,length
def setSize(self,size):
print("execute setSize")
self.__length,self.__width=size #使用序列解包获取长度和宽度
def getSize(self):
print("execute getSize ")
return self.__length,self.__width
def delSize(self):
print("execute delSize ")
self.setSize((0,0))
def setLen(self,length):
print("execute setLen")
self.__length=length
def getLen(self):
print("execute getLen")
return self.__length
def setWidth(self,width):
print("execute setWidth")
self.__width=width
def getWidth(self):
print("execute getWidth")
return self.__width
size = property(getSize,setSize,delSize,'用元组存储的长方形的长和宽')
len = property(getLen,setLen,0,'长方形的长')
width = property(getWidth,setWidth,0,'长方形的宽')
rect = Rectangle(5,3)
rect.size,rect.len,rect.width
rect.size=(5,4)
rect.size,rect.len,rect.width
help(Rectangle.size)
print(Rectangle.len.__doc__,Rectangle.width.__doc__,sep='\n')
del rect.size
三、 案例截屏


从上面的轨迹可以清晰看到,所有对property定义属性的访问都调用了对应的访问方法,赋值并不是直接赋值,而是调用setSize、setLen、setWidth方法,del并不是直接删除,而是调用delSize方法,查询变量则是调用的get方法。
本节结合案例详细介绍了对在类中使用property函数定义一个可供外部简便访问的实例属性的详细过程,通过案例可以明确地看到property定义的属性的读写访问都会通过内部的方法进行,并且属性与内部实例变量之间可以是一对多的关系,甚至是不和实例变量建立关系直接执行方法(如把上面相关的方法访问实例变量的语句去掉只留下print语句就是这样的效果)。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!
第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现的更多相关文章
- 第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter
上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一. 案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...
- 第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样?
第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样? 一. 案例说明 我们上节提到了,使用property函数定义的属性不要与类内已经定义的普通实例变量重 ...
- 第8.22节 Python案例详解:重写 “富比较”方法控制比较逻辑
一. 案例说明 本节定义一个小汽车的类Car,类中包括车名carname.百公里油耗oilcostper100km.价格price三个属性.然后实现__lt__.__gt__.__le__.__ge_ ...
- 小甲鱼PE详解之IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用(PE详解03)
咱接着往下讲解IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用! (视频教程:http://fishc.com/a/shipin/jiemixilie/) 接着我们来谈谈 IM ...
- 第11.24节 Python 中re模块的其他函数
一. re.compile函数 正则表达式编译函数,在后面章节专门介绍. 二. re.escape(pattern) re.escape是一个工具函数,用于对字符串pattern中所有可能被视为正则表 ...
- 小甲鱼PE详解之IMAGE_NT_HEADERS结构定义即各个属性的作用(PE详解02)
PE Header 是PE相关结构NT映像头(IMAGE_NT_HEADER)的简称,里边包含着许多PE装载器用到的重要字段.下边小甲鱼将为大家详细讲解哈~ (视频教程:http://fishc.co ...
- 小甲鱼PE详解之IMAGE_DOS_HEADER结构定义即各个属性的作用(PE详解01)
(注:最左边是文件头的偏移量.) IMAGE_DOS_HEADER STRUCT { +0h WORD e_magic // Magic DOS signature MZ(4Dh 5Ah) ...
- Python使用property函数定义的属性名与其他实例变量重名会怎么样?
首先如果定义的属性名与该属性对应的操作方法操作的实例对象同名就会触发无穷的递归调用,相关部分请参考<Python案例详解:使用property函数定义与实例变量同名的属性会怎样?> 但如果 ...
- Python使用property函数定义属性访问方法如果不定义fget会怎么样?
我们知道Python使用property函数定义属性访问方法时的语法如下: 实例属性=property(fget=None, fset=None, fdel=None, doc=None) 而是要@p ...
随机推荐
- 理解Task和和async await
本文将详解C#类当中的Task,以及异步函数async await和Task的关系 一.Task的前世今生 1.Thread 一开始我们需要创建线程的时候一般是通过Thread创建线程,一般常用创建线 ...
- FullCalendar v5.3.2版本制作一个航班日历Demo
今天一个新需求是制作一个航班日历来订舱.然后我就各种找,最后找到FullCalendar,过程非常煎熬,网上例子大部分没用,大部分没有完整版.官网教程又不是很详细.搞了几天才彻底搞好这个航班日历,有需 ...
- 11 幂等 Idempotence
11 幂等 Idempotence HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用.(注意是副作用) GET http://www.bank.com/account/123456 ...
- 关于layui图片/文件上传
一:常规使用 普通文件上传 (传入服务器一张图片) 1.前台代码: <!DOCTYPE html><html><head> <meta charset=& ...
- MSSQL 指定分隔符号 生成数据集
DECLARE @xml VARCHAR(MAX)='磨毛:1 缩率:2 干磨:3 湿摩:4 水洗牢度:5 手感:6 防水:7 PH:8 日晒:9' SET @xml= '<root>'+ ...
- 看看poll 事件掩码 --- review代码时发现掩码不分的错误
事件 描述 是否可作为输入(events) 是否可作为输出(revents) POLLIN 数据可读(包括普通数据&优先数据) 是 是 POLLOUT 数据可写(普通数据&优先数据) ...
- nginx&http 第二章 ngx 事件event配置等初始化
event事件模块,配置分为两层:ngx_events_module 事件模块 和 ngx_event_core_module 事件核心模块.ngx_events_module:模块类型NGX_COR ...
- 卷积神经网络图像纹理合成 Texture Synthesis Using Convolutional Neural Networks
代码实现 概述 这是关于Texture Synthesis Using Convolutional Neural Networks论文的tensorflow2.0代码实现,使用keras预训练的VGG ...
- 【进阶之路】Redis基础知识两篇就满足(二)
导言 大家好,我是南橘,一名练习时常两年半的java练习生,这是我在博客园的第二篇文章,当然,都是要从别处搬运过来的,不过以后新的文章也会在博客园同步发布,希望大家能多多支持^_^ 这篇文章的出现,首 ...
- [PHP安全特性学习]strcmp()函数安全漏洞
简介 PHP函数的安全特性-strcmp() 函数 php-strcmp()函数 PHP strcmp() 函数 strcmp() 函数比较两个字符串. 注释:strcmp() 函数是二进制安全的,且 ...