浅谈 Python 魔法函数 __getattr__ 与 __getattribute__

Honey ·
更新时间:2024-09-20
· 714 次阅读

魔法函数 getattrgetattribute

简单说明 __getattr____getattribute__ 魔法函数的使用

目录魔法函数 __getattr__ 与 __getattribute____getattr__魔法函数作用__getattribute__魔法函数总结

书上说,天下没有不散的宴席,不要怕,书上还说了,人生何处不相逢。
——《雪中悍刀行》

__getattr__魔法函数

_getattr_ 魔法函数是在你试图访问一个不存在的属性时调用的。

如果没有这个魔法函数,访问不存在的属性程序会报错。

from datetime import date class User: def __init__(self, name, birthday): self.name = name self.birthday = birthday if __name__ == '__main__': user = User("无梦生7", date(year=1997, month=1, day=1)) print(user.age) # 访问不存在的属性

输出结果如下。
在这里插入图片描述

上面程序中我们加入 __getattr__

from datetime import date class User: def __init__(self, name, birthday): self.name = name self.birthday = birthday # 查找不到属性的时候调用 def __getattr__(self, item): return "not find attr" if __name__ == '__main__': user = User("无梦生7", date(year=1997, month=1, day=1)) print(user.age) # 访问不存在的属性

输出结果如下。

在这里插入图片描述

作用 使用这个函数我们可以加入自己的逻辑处理 如返回一个 None,或者打印一些提示内容,或者进行纠正。 比如你的属性都是小写,对方访问一个大写的,你这里就可以自动转换成小写等。
__getattribute__魔法函数

__getattribute__ 魔法函数是在 __getattr__ 之前执行

无论你访问的属性是不是存在都返回这个函数里面的返回值。 即无条件优先进入这个魔法函数内,不会先寻找其他属性。 这个方法尽量不要自己重写,只有在写框架是会用到此魔法函数。 from datetime import date class User: def __init__(self, name, birthday): self.name = name self.birthday = birthday # 查找不到属性的时候调用 def __getattr__(self, item): return "not find attr" def __getattribute__(self, item): return "无条件优先进入" if __name__ == '__main__': user = User("无梦生7", date(year=1997, month=1, day=1)) print(user.age) # 访问不存在的属性

输出结果如下。

在这里插入图片描述

总结

__getattr__ 在查找不到属性的时候调用,如果没有这个魔法函数会报错。

__getattribute__ 无条件优先进入这个魔法函数内,不会先寻找其他属性。


作者:无梦生7



getattribute 函数 Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号