8.2 __getattr__、__getattribute__魔法函数¶
__getattr__¶
class User:
def __init__(self, name):
self.name = name
def __getattr__(self, item):
return 'Not found attribute %s' % item
if __name__ == '__main__':
user = User('linda')
print(user.age) # Not found attribute age
- __getattr__, 在查找不到属性的时候调用
- 类似 else 机制
class User:
def __init__(self, info=None):
if not info:
info = {}
self.info = info
def __getattr__(self, item):
return self.info[item]
if __name__ == '__main__':
user = User({'name': 'linda', 'age': 18})
print(user.name)
print(user.age)
- 神奇的代理操作
__getattribute__¶
class User:
def __init__(self, name):
self.name = name
def __getattribute__(self, item):
return 'get_attribute'
if __name__ == '__main__':
user = User('linda')
print(user.name) # get_attribute
print(user.test) # get_attribute
print(user.other) # get_attribute
- 只要调用属性,就会触发 __getattribute__
- 把持了整个属性调用入口,尽量不要重写这个方法
- 写框架时会涉及到