官网解释:
- <李>
<代码类=" descclassname ">对象。代码> <代码类=" descname "> 代码> 自我, 名称
李> <李>时调用一个属性查询没有发现属性在通常的地方(即它不是一个实例属性也不是班上发现树for <代码类=" docutils文字notranslate "> 代码>)只<代码类=" docutils文字notranslate "> 代码>,是属性名。<强>此方法应该返回强> <强>或强> <强> <代码类=" xref py py-exc docutils文字notranslate "> 代码> 强> <强>。强>
李>
当我们想调用类中某些东西,而类中没有,解释器铁定报错,停止运行,那有人就想了:真麻烦,每次都要重新执行一遍,如果当我调用错了内容,程序能把我这个错误当默认程序执行,而不停止我程序运行就好了,所以,为了解决这类问题,就出来了__getattr__这个函数了。
我猜的,因为解决程序困难也是一种需求只
看没有__getattr的出错调用:
# !/usr/bin/python
# - * -编码:utf - 8 - * - - - - - -
类学生(对象):
,,def __init__(自我):
,,,,self.name=& # 39;迈克尔# 39;
s=学生()
打印s.name
打印s.score ,,,#类中没有这个属性
看,第一个打印正常执行,第二个由于课堂中没有这个属性,所以就报错了。
再看,带__getattr__的类:
# !/usr/bin/python
# - * -编码:utf - 8 - * - - - - - -
类学生(对象):
,,def __init__(自我):
,,,,self.name=& # 39;迈克尔# 39;
,,def __getattr__(自我,其他):
,,,,如果其他==& # 39;分数# 39;:
,,,,,,返回99
,,,,,,,
s=学生()
打印s.name
打印s.score ,#类中没有这个属性
打印s.gg ,,,#类中没有这个属性
看一遍,打印的得分和gg在类中都没有定义,但都有输出。因为程序往__getattr__中找,刚刚好定义了一个字符判断,如果其他==& # 39;分数# 39;:,所以输出了99,,而gg一个字都没提,就默认输出了。是不是感觉以后码程序的时候再也不用担心程序停止运行了。
※发、现的强大的链式调用写法:
class 链(对象): ,,,def __init__(自我,,路径=& # 39;& # 39;): ,,,,,,,self._path =,路径 ,,,def __getattr__(自我,,路径): ,,,,,,,return 链(& # 39;% s/% & # 39;, %, (self._path,路径),,,#调用自己 ,,,def __str__(自我): ,,,,,,,return self._path ,,,__repr__ =__str__ ,,,, 时间=f 链() print (f.www.anc.do.glob)
结果:
/www/非洲//水珠