第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函数定义属性简化属性访问代码实现的更多相关文章

  1. 第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter

    上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一.    案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...

  2. 第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样?

    第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样? 一.    案例说明 我们上节提到了,使用property函数定义的属性不要与类内已经定义的普通实例变量重 ...

  3. 第8.22节 Python案例详解:重写 “富比较”方法控制比较逻辑

    一. 案例说明 本节定义一个小汽车的类Car,类中包括车名carname.百公里油耗oilcostper100km.价格price三个属性.然后实现__lt__.__gt__.__le__.__ge_ ...

  4. 小甲鱼PE详解之IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用(PE详解03)

    咱接着往下讲解IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用! (视频教程:http://fishc.com/a/shipin/jiemixilie/) 接着我们来谈谈 IM ...

  5. 第11.24节 Python 中re模块的其他函数

    一. re.compile函数 正则表达式编译函数,在后面章节专门介绍. 二. re.escape(pattern) re.escape是一个工具函数,用于对字符串pattern中所有可能被视为正则表 ...

  6. 小甲鱼PE详解之IMAGE_NT_HEADERS结构定义即各个属性的作用(PE详解02)

    PE Header 是PE相关结构NT映像头(IMAGE_NT_HEADER)的简称,里边包含着许多PE装载器用到的重要字段.下边小甲鱼将为大家详细讲解哈~ (视频教程:http://fishc.co ...

  7. 小甲鱼PE详解之IMAGE_DOS_HEADER结构定义即各个属性的作用(PE详解01)

    (注:最左边是文件头的偏移量.) IMAGE_DOS_HEADER STRUCT {  +0h  WORD  e_magic  // Magic DOS signature MZ(4Dh 5Ah)   ...

  8. Python使用property函数定义的属性名与其他实例变量重名会怎么样?

    首先如果定义的属性名与该属性对应的操作方法操作的实例对象同名就会触发无穷的递归调用,相关部分请参考<Python案例详解:使用property函数定义与实例变量同名的属性会怎样?> 但如果 ...

  9. Python使用property函数定义属性访问方法如果不定义fget会怎么样?

    我们知道Python使用property函数定义属性访问方法时的语法如下: 实例属性=property(fget=None, fset=None, fdel=None, doc=None) 而是要@p ...

随机推荐

  1. How to: Debug X++ Code Running in .NET Business Connector [AX 2012]

    This topic has not yet been rated - Rate this topic  http://msdn.microsoft.com/EN-US/library/bb19006 ...

  2. solr 文档二

    SOLR 5.5.5文档 参考博文: http://blog.csdn.net/matthewei6/article/details/50620600 作者:毛平 时间:2018年1月15日 17:3 ...

  3. Appium学习之驱动真机运行

    一.Appium工具的简单原理 Appium工具可以分为:客户端(appium-client).服务端(appium-server)和移动设备端(模拟器或者真机).客户端支持多语言,如:python- ...

  4. Spring Cloud 纯干货,从入门到实战

    导读 之前写过一篇SpringCloud从入门到精通的点我直达,微服务基础知识点我直达,今天我们使用Spring Cloud模拟一个电商项目.分别有以下2个服务,商品.订单.下面我们开始叭 技术栈 S ...

  5. Electron入门指北

    最近几年最火的桌面化技术,无疑是Qt+和Electron. 两者都有跨平台桌面化技术,并不局限于Windows系统.前者因嵌入式而诞生,在演变过程中,逐步完善了生态以及工具链.后者则是依托于Node. ...

  6. JS多物体运动案例:变宽、变高

    任务描述: 当鼠标移入"变宽"矩形时,该矩形宽度逐渐增加至400px,移出该矩形,宽度逐渐恢复至初始值;当鼠标移入"变高"矩形时,该矩形高度逐渐增加至400px ...

  7. 牛客网-声网2020校招-通用C++笔试题-2020.9.3

    1. 操作系统中两个进程争夺同一个资源会发生什么情况? 答:不一定死锁 解析:产生死锁的四个必要条件为 (1)互斥条件:一个资源每次只能被一个进程使用. (2)不可剥夺条件:进程已获得的资源,在未使用 ...

  8. [JLOI2011]飞行路线 题解

    [JLOI2011]飞行路线 题解 题目TP门 题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有 ...

  9. mysql多表查询之子语句查询

    1.子语句查询 1.1子语句查询出来的结果集作为临时表名使用 select * from (select * from person) as aaa; -- as这个起别名关键字是可以省略的 1.2查 ...

  10. mysql数据库安装与卸载以及Navicat安装

    关系型数据库Mysql 1.mysql官网网址:www.mysql.org 2.mysql数据库安装 傻瓜式安装下载地址 https://dev.mysql.com/downloads/install ...