python类:面向对象高级编程__getattr__

  

官网解释:

<李>

<代码类=" 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 ,,,#类中没有这个属性

 python类:面向对象高级编程__getattr__

看,第一个打印正常执行,第二个由于课堂中没有这个属性,所以就报错了。


再看,带__getattr__的类:

# !/usr/bin/python

# - * -编码:utf - 8 - * - - - - - -


类学生(对象):

,,def __init__(自我):

,,,,self.name=& # 39;迈克尔# 39;


,,def __getattr__(自我,其他):

,,,,如果其他==& # 39;分数# 39;:

,,,,,,返回99

,,,,,,,

s=学生()

打印s.name

 python类:面向对象高级编程__getattr__

打印s.score ,#类中没有这个属性

 python类:面向对象高级编程__getattr__

打印s.gg ,,,#类中没有这个属性

 python类:面向对象高级编程__getattr__


看一遍,打印的得分和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/非洲//水珠


python类:面向对象高级编程__getattr__