简单说明 __getattr__
与 __getattribute__
魔法函数的使用
书上说,天下没有不散的宴席,不要怕,书上还说了,人生何处不相逢。
——《雪中悍刀行》
_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__
魔法函数是在 __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__
无条件优先进入这个魔法函数内,不会先寻找其他属性。