Python魔术方法 getattr、__getattribute__使用详解
- _getattr_(self,attr)
- 触发时机:获取不存在的对象成员时触发
- 参数:1、接收当前对象的self,2、获取成员名称的字符串
- 返回值: 必须有值
- 作用:为访问不存在的属性设置值
- 注意:_getattribute_()无论何时都会在_getattr_()之前触发,触发了_getattribute_()有返回值就不会在触发_getattr_()了
- _getattribute_(self,attr)
- 触发时机:使用对象成员时触发,无论成员是否存在
- 参数:1、接收当前对象的self,2、获取成员名称的字符串
- 返回值: 必须有值
- 作用:在具有封装操作(私有化时),为程序开部分访问权限使用
class Human:
name = None
sex = None
age = None
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
def __getattr__(self,attr):
print('触发了__getattr__(),要访问对象的{}成员'.format(attr))
return '访问成员不存在'
pass
def __getattribute__(self,attr):
print('触发了__getattribute__(),要访问对象的{}成员'.format(attr))
if attr in ('name','sex','age','height','test'):
return object.__getattribute__(self,attr)
else :
return '返回默认值'
def test(self):
print('调用测试方法test')
xm = Human('小明','男',18)
print(xm.name)
触发了__getattribute__(),要访问对象的name成员
小明
print(xm.test)
print()
xm.test()
触发了__getattribute__(),要访问对象的test成员
<bound method Human.test of <__main__.Human object at 0x0000018D59C5B080>>
触发了__getattribute__(),要访问对象的test成员
调用测试方法test
print(xm.wight)
print('\n####################################################################\n')
print(xm.height)
触发了__getattribute__(),要访问对象的wight成员
返回默认值
####################################################################
触发了__getattribute__(),要访问对象的height成员
触发了__getattr__(),要访问对象的height成员
访问成员不存在