上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明。

一、    案例说明

本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只定义了长度属性的操作。包括三个完整的装饰器,如果大家想试一下少一个操作方法的装饰器,可以直接把对应装饰器去除即可。

二、    案例代码

1.    定义类Rectangle

class Rectangle():
    def __init__(self,length,width): self.width,self.length = width,length
   
    @property  #定义getter装饰器
    def len(self):
       print("execute getLen")
       return self.length
       
    @len.setter   #定义setter装饰器
    def len(self,length):
       print("execute setLen")
       self.length=length
       
    @len.deleter  #定义deleter 装饰器
  def len(self):self.length=0

2.    定义实例对象并执行相关操作(交互模式下执行)

rect = Rectangle(5,3)
rect.len  #获取长方形的长
rect.len=10 #设置长方形的长
rect.len  #获取长方形的长
del rect.len #删除长方形的长

从下面的执行截图可看出,相关操作都是调用对应的方法执行,只是方法的名字必须是固定的属性名。

三、    案例截图

 

四、    异常情况的代码和截图

与《第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样?》一样,老猿也测试了属性名相同时的异常情况,证实该异常情况与7.25节介绍的异常情况完全一样。相关代码和执行的部分截图如下:

#property装饰器设置与类变量的同名属性 
class Rectangle():
    def __init__(self,length,width): self.width,self.length = width,length
   
   @property
   def length(self):
       print("execute getLen")
       return self.length
       
   @length.setter    
   def length(self,length):
       print("execute setLen")
       self.length=length
   @length.deleter
   def length(self):self.length=0
       
rect = Rectangle(5,3)

执行截图:

通过以上代码的执行在此验证了属性名不能与实例变量同名,除非是使用一个本身没有任何数据操作的实例变量。

本节老猿结合案例详细介绍了property装饰器的使用,并举例说明装饰器定义的属性不能和类的实例变量同名,否则可能会引发异常。截止到本节,类和类型的基础知识讲了大部分,还有部分后面再开单独章节介绍,本章到此结束。

老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter的更多相关文章

  1. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  2. Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析

    Python使用property函数和使用@property装饰器都能定义属性的get.set及delete的访问方法,他们的相同点主要如下三点: 1.定义这些方法后,代码中对相关属性的访问实际上都会 ...

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

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

  4. 第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现

    第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现 一.    案例说明 本节将通过一个案例介绍怎么使用property定义快捷的属性访问.案例中使用Rectan ...

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

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

  6. 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析

    一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...

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

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

  8. 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析

    第7.17节  Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...

  9. 第7.13节 案例详解:Python类变量

    第7.13节 案例详解:Python类变量 上节介绍了类变量的定义和使用方法,并举例进行了说明.本节将通过一个更完整的例子来说明. 一.    定义函数dirp def dirp(iter): ret ...

随机推荐

  1. ant-design-vue 快速避坑指南

    ant-design-vue是蚂蚁金服 Ant Design 官方唯一推荐的Vue版UI组件库,它其实是Ant Design的Vue实现,组件的风格与Ant Design保持同步,组件的html结构和 ...

  2. Thinkphp3.2 cms之权限管理

    五.权限管理 <?php namespace Admin\Controller; use Think\Controller; class CommonController extends Con ...

  3. 知识补充之Django缓存

    缓存 简单概括就是将对数据库操作查询所得到的数据放入另外一台机器上(缓存)中,当用户再次请求时,直接去缓存中拿,避免对数据库的频繁操作,加快数据的显示时间,需要知道的是,缓存里面的数据一般都设置有超时 ...

  4. 25个Android酷炫开源UI框架

    1.Side-Menu.Android 分类侧滑菜单,Yalantis 出品.项目地址:https://github.com/Yalantis/Side-Menu.Android2.Context-M ...

  5. layui系列学习第一天

    新开一个博客系列 记录下layui学习过程及感受 今天受到很大的打击  ...希望 自己能坚持做好  到1.12号可以完成这个博客 一.基础说明 layui css 命名规范:1.layui-模块名- ...

  6. 使用LSV进行通视分析教程

    在LSV"分析"菜单栏中点击"通视分析" 在地面或者建筑物表面选择一点,然后鼠标移动到另一个位置点击结束,即可判断出两点间是否有障碍物,是否可见.通视分析结果显 ...

  7. [MIT6.006] 22. Daynamic Programming IV: Guitar Fingering, Tetris, Super Mario Bro. 动态规划IV:吉他指弹,俄罗斯方块,超级玛丽奥

    之前我们讲到动态规划五步中有个Guessing猜,一般情况下猜有两种情况: 在猜和递归上:猜的是用于解决更大问题的子问题: 在子问题定义上:如果要猜更多,就要增加更多子问题. 下面我们来看如果像背包问 ...

  8. lua调用dll demo

    使用的是lua5.3 DllMain.cpp 1 //生成的dll 是 lua_add53.dll 2 //luaopen_lua_add 3 extern "C" { 4 #in ...

  9. go-zero之web框架

    go-zero 是一个集成了各种工程实践的 web 和 rpc 框架,其中rest是web框架模块,基于Go语言原生的http包进行构建,是一个轻量的,高性能的,功能完整的,简单易用的web框架 服务 ...

  10. 小程序后端获取openid (php实例)

    小程序获取openid 首先,小程序授权登录的时候,前端就会获取到code 而后端接收到了code之后,就可以向微信发起请求,获取用户的openid代码如下: <?php $code = $_R ...