­

Python 魔法方法之__getattr__(self,name)

  • 2020 年 3 月 31 日
  • 筆記

前言

当实例对象调用一个不存在的属性时,系统通常会报错,那有啥办法避免这种现象么,或者说自定义报错信息,答案是肯定的,我们可以通过定义__getattr__(self,name)魔法方法来实现。

__getattr__(self, name)

__getattr__(self,name) 定义当用户获取一个不存在的属性时的行为。 当实例对象调用不存在的属性时,如果在类中没重载__getattr__(self,name)方法,则会抛出AttributeError异常,如下所示:

>>> class Animal():  ...     pass  ...  >>> dog = Animal()  >>> dog.a  Traceback (most recent call last):    File "<stdin>", line 1, in <module>  AttributeError: 'Animal' object has no attribute 'a'  

而当我们重载了__getattr__(self,name)方法,一旦属性查找失败,就会调用__getattr__(self,name)方法:

>>> class Animal():  ...     def __getattr__(self,name):  ...             print('no %s' % name)  ...  >>> dog = Animal()  >>> dog.aa  no aa

如上所示,当我们的实例对象访问不存在的属性aa时,就自动调用了__getattr__(self, name)方法,返回方法内自定义的信息。

这边也来说下调用__getattr__的详细过程:

1.在对象的实例属性中寻找,找不到执行下一步2.在的类中查找类属性,找不到执行下一步3.在对象的继承链上寻找,找不到执行下一步4.调用__getattr__ 方法,如果用户没有定义或者还是找不到,抛出AttributeError异常,属性查找失败!