在python中,我们可以拦截对象的所有特性访问。通过这种拦截的思路,我们可以在旧式类中实现property方法。

  1. __getattribute__(self, name) #当特性name被访问时自动调用(只能在新式类中使用)
  2. __getattr__(self, name) #当特性name被访问且对象没有相应的特性时被自动调用
  3. __setattr__(self, name, value) #当试图给特性name赋值时会被自动调用
  4. __delattr__(self, name) #当试图删除特性name时被自动调用
  5.  
  6. #*相比于使用property有点复杂,但是特殊方法用途很广

下面是举例:

  1. class Demo5(object):
  2. def __init__(self):
  3. print("这是构造函数")
  4. self._value1 = None
  5. self._value2 = None
  6.  
  7. def __setattr__(self, key, value):
  8. print("try to set the value of the %s property" % (key,))
  9. if key == 'newValue':
  10. self._value1, self._value2 = value
  11. else:
  12. print("the property key is not newValue, now create or set it through __dict__")
  13. self.__dict__[key] = value
  14.  
  15. def __getattr__(self, item):
  16. print("try to get the value of %s " % (item,))
  17. if item == 'newValue':
  18. return self._value1, self._value2
  19. else:
  20. print("the %s item is not exist" % (item,))
  21. #raise AttributeError
  22.  
  23. def __delattr__(self, item):
  24. if item == 'newValue':
  25. print("delete the value of newValue")
  26. del self._value1
  27. del self._value2
  28. else:
  29. print("delete other values ,the value name is %s" % item)
  30.  
  31. if __name__ == "__main__":
  32. testDemo = Demo5()
  33. print(testDemo.newValue)
  34. testDemo.newValue = "name","helloworld"
  35. print("print the value of property:", testDemo.newValue)
  36. print(testDemo.notExist)
  37. del testDemo.newValue

下面是结果:

  1. 这是构造函数
  2. try to set the value of the _value1 property
  3. the property key is not newValue, now create or set it through __dict__
  4. try to set the value of the _value2 property
  5. the property key is not newValue, now create or set it through __dict__
  6. try to get the value of newValue
  7. (None, None)
  8. try to set the value of the newValue property
  9. try to set the value of the _value1 property
  10. the property key is not newValue, now create or set it through __dict__
  11. try to set the value of the _value2 property
  12. the property key is not newValue, now create or set it through __dict__
  13. try to get the value of newValue
  14. ('print the value of property:', ('name', 'helloworld'))
  15. try to get the value of notExist
  16. the notExist item is not exist
  17. None
  18. delete the value of newValue
  19. delete other values ,the value name is _value1
  20. delete other values ,the value name is _value2

**其实,我们可以发现在使用__setatter__ , __getatter__,__delatter__这些接口时会对其他的值造成影响,因为这个是通用的必须调用的接口。

python 旧类中使用property特性的方法的更多相关文章

  1. python定义类()中写object和不写的区别

    这里需要说明一下: python3中,类定义默认继承object,所以写不写没有区别 但在python2中,并不是这样 所以此内容是针对python2的,当然python3默认继承,不代表我们就傻乎乎 ...

  2. 【python】类中的self

    在python的类中,经常会写self,代表对象自己.如下例: #coding=utf-8 class Foo: def __init__(self, name): self.name = name ...

  3. Python: 类中为什么要定义__init__()方法

    学习并转自:https://blog.csdn.net/geerniya/article/details/77487941 1. 不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. c ...

  4. 实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法

    实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法 #import <Found ...

  5. 类中为什么要定义__init__()方法

    总结一下, 加上__init__()方法后,类才可以实例化,不加类就是个空壳,相当于一个方法集合 学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1. ...

  6. C#判断一个类中有无"指定名称"的方法

    C#中可以通过反射分析元数据来解决这个问题,示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...

  7. QRadioButton类中Toggled()信号的使用方法

    QRadioButton类中Toggled()信号的使用方法 1.说明 QRadioButton中,Toggled()信号是在Radio Button状态(开.关)切换时发出的,而clicked()信 ...

  8. File类中的list和listFiles方法

    File类中的list和listFiles方法 list()方法是返回某个目录下的所有文件和目录的文件名,返回的是String数组 listFiles()方法是返回某个目录下所有文件和目录的绝对路径, ...

  9. Python+selenium自动化测试中Windows窗口跳转方法

    Python+selenium自动化测试中Windows窗口跳转方法 #第一种方法 #获得当前窗口 nowhandle=driver.current_window_handle #打开弹窗 drive ...

随机推荐

  1. python3开发进阶-Django框架起飞前的准备

    阅读目录 安装 创建项目 运行 文件配置的说明 三个组件 一.安装(安装最新LTS版) Django官网下载页面 根据官方的图版本,我们下载1.11版本的,最好用! 有两种下载方式一种直接cmd里: ...

  2. 十. 图形界面(GUI)设计12.滚动条

    滚动条(JScrollBar)也称为滑块,用来表示一个相对值,该值代表指定范围内的一个整数.例如,用Word编辑文档时,编辑窗右边的滑块对应当前编辑位置在整个文档中的相对位置,可以通过移动选择新的编辑 ...

  3. css layout入门(转)

    元素与盒 在HTML中常常使用的概念是元素,而在CSS中,布局的基本单位是盒,盒总是矩形的. 元素与盒并非一一对应的关系,一个元素可能生成多个盒,CSS规则中的伪元素也可能生成盒,display属性为 ...

  4. React Native学习之自定义Navigator

    Navigator还是最常用的组件, 所以自己封装了一个, 使用起来也比较简单, 如下: 首先导入组件 var MLNavigator = require('../Lib/MLNavigator'); ...

  5. Error: Top-level design entity "dff" is undefined

    原因是:在quartus库文件里面已将dff定义了,要是找使用这个名字重命名了,因而需要重新命名为其他的名字.

  6. 如何订阅Linux相关的邮件列表

    转:http://blog.163.com/sunshine_linting/blog/static/44893323201282114012845/ 1.google"linux kern ...

  7. 对list_entry(ptr, type, member)的理解

    如何根据一个结构体成员的地址.结构体类型以及该结构体成员名获得该结构体的首地址? #define list_entry(ptr, type, member) \ ((type *)((char *)( ...

  8. Apache -Common-lang包使用

    原文:http://weigang-gao.iteye.com/blog/2188739 ArrayUtils – 用于对数组的操作,如添加.查找.删除.子数组.倒序.元素类型转换等: BitFiel ...

  9. CMD_命令行

    一.bat执行一闪而过 最后一个end下一行,加PAUSE   二.cmd命令:不是内部或外部命令,也不是可运行的程序或批处理文件 解决: 需将路径先切换到system32下  cd c:\WINDO ...

  10. 安装notepad++ in ubuntu16.04

    一.安装notepad++ Ubuntu下的安装方法: sudo add-apt-repository ppa:notepadqq-team/notepadqq sudo apt-get update ...