1、__getattr__

当我们访问一个不存在的属性的时候,会抛出异常,提示我们不存在这个属性。而这个异常就是__getattr__方法抛出的,其原因在于他是访问一个不存在的属性的最后落脚点,作为异常抛出的地方提示出错再适合不过了。

看例子,我们找一个存在的属性和不存在的属性。

  1. class A(object):
  2. def __init__(self, value):
  3. self.value = value
  4.  
  5. def __getattr__(self, item):
  6. print "into __getattr__"
  7. return "can not find"
  8.  
  9. a = A(10)
  10. print a.value
  11. # 10
  12. print a.name
  13. # into __getattr__
  14. # can not find

可以看出,访问存在的属性时,会正常返回值,若该值不存在,则会进入最后的兜底函数__getattr__。

2、__setattr__

在对一个属性设置值的时候,会调用到这个函数,每个设置值的方式都会进入这个方法。

  1. class A(object):
  2. def __init__(self, value):
  3. print "into __init__"
  4. self.value = value
  5.  
  6. def __setattr__(self, name, value):
  7. print "into __setattr__"
  8. if value == 10:
  9. print "from __init__"
  10. object.__setattr__(self, name, value)
  11.  
  12.  
  13. a = A(10)
  14. # into __init__
  15. # into __setattr__
  16. # from __init__
  17. print a.value
  18. # 10
  19. a.value = 100
  20. # into __setattr__
  21. print a.value
  22. # 100

在实例化的时候,会进行初始化,在__init__里,对value的属性值进行了设置,这时候会调用__setattr__方法。

在对a.value重新设置值100的时候,会再次进入__setattr__方法。

需要注意的地方是,在重写__setattr__方法的时候千万不要重复调用造成死循环。

比如:

  1. class A(object):
  2. def __init__(self, value):
  3. self.value = value
  4.  
  5. def __setattr__(self, name, value):
  6. self.name = value

这是个死循环。当我们实例化这个类的时候,会进入__init__,然后对value进行设置值,设置值会进入__setattr__方法,而__setattr__方法里面又有一个self.name=value设置值的操作,会再次调用自身__setattr__,造成死循环。

除了上面调用object类的__setattr__避开死循环,还可以如下重写__setattr__避开循环。

  1. class A(object):
  2. def __init__(self, value):
  3. self.value = value
  4.  
  5. def __setattr__(self, name, value):
  6. self.__dict__[name] = value
  7.  
  8.  
  9. a = A(10)
  10. print a.value
  11. # 10

3、__delattr__

__delattr__是个删除属性的方法

  1. class A(object):
  2. def __init__(self, value):
  3. self.value = value
  4.  
  5. def __delattr__(self, item):
  6. object.__delattr__(self, item)
  7.  
  8. def __getattr__(self, item):
  9. return "when can not find attribute into __getattr__"
  10.  
  11.  
  12.  
  13. a = A(10)
  14. print a.value
  15. # 10
  16. del a.value
  17. print a.value
  18. # when can not find attribute into __getattr__

__delattr__也要避免死循环的问题,就如__setattr__一样,在重写__delattr__,避免重复调用。

 

最新文章

  1. 格式化input输入内容(金额)
  2. Oracle 11g导出空表、少表的解决办法
  3. Thinking in Java——笔记(17)
  4. 更新系统没有mac dashboard 问题解决
  5. Unity3D热更新全书-脚本(二) 两级分化
  6. Skill
  7. 【转】iOS中设置导航栏标题的字体颜色和大小
  8. 高级Bash脚本编程指南
  9. hadoop命令报错:权限问题
  10. 设置Tomcat应用自动部署目录
  11. iOS: 学习笔记, Swift运算符定义
  12. raid5什么意思?怎样做raid5?raid5 几块硬盘?
  13. iOS开源 框架
  14. (转)OS X Mountain Lion 系统配置 Apache+Mysql+PHP 详细教程
  15. C# 实现简单状态机(参考代码)
  16. Java IO读写中文各种乱码问题 【转】
  17. python 学习网站
  18. python实现简单函数发生器
  19. 如何解决js递归里面出现的堆栈溢出
  20. SSM框架和SSH框架的区别

热门文章

  1. [ flask ] 解耦models(解决models文件太臃肿的问题)
  2. Centos7 文件修改详情
  3. Eclipse配置Maven3.5
  4. GitHub 公布 2021 Top 10 博文「GitHub 热点速览」
  5. leetcode 46. 全排列 及 47. 全排列 II
  6. [FatFs 学习] SD卡总结-SPI模式
  7. spring 事务传播性
  8. C# 基本控件使用练习
  9. 一个BPMN流程示例带你认识项目中流程的生命周期
  10. Tomcat-默认访问的工程和默认访问的资源