当实例对象调用一个不存在的属性时,系统通常会报错,那有啥办法避免这种现象么,或者说自定义报错信息,答案是肯定的,我们可以通过定义__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异常,属性查找失败!