zoukankan      html  css  js  c++  java
  • 第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter

    上节详细介绍了利用@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的世界。
    欢迎大家批评指正,谢谢大家关注!

  • 相关阅读:
    动态规划(0-1背包)---划分数组为和相等的两部分
    动态规划(0-1背包)
    动态规划(最长递增子序列)---最长公共子序列
    动态规划(最长递增子序列)---最长摆动子序列
    动态规划(最长递增子序列)---最长递增子序列
    动态规划(最长递增子序列)
    动态规划(分割整数)---分割整数构成字母字符串
    浅谈进程同步和互斥的概念
    如何由Height Map生成Normal Map
    3D中的切线空间简介
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/11087687.html
Copyright © 2011-2022 走看看