python 内建属性 getattribute 是属性拦截器,当调用其他属性时,会先调用它来看看是否有调用属性值之前的操作
class People(object):
def __init__(self, age, name):
self.age = age
self.name = name
def __getattribute__(self, obj):
if obj == 'age':
print("被询问了年龄:")
return object.__getattribute__(self, obj)
elif obj == 'name':
print('被询问了名字')
return object.__getattribute__(self, obj)
else:
return object.__getattribute__(self, obj)
p1 = People(13, '小明')
print(p1.age)
print(p1.name)
上面的代码可以看到,每次调用实例属性的时候, 属性名字会先作为字符串传到 getattribute 方法中的 obj 中, 此时我们可以在 getattribute方法中来对传入的obj进行判断,如果是我们需要进行操作的属性,就在return之前进行操作. 如果还需要return原来的属性结果, 那么就调用 object 类的getattribute 返回即可
输出结果:
被询问了年龄:
13
被询问了名字
小明
注意,在getattribute方法内部, 如果没有把握, 不要再次调用self.xxx 方法. 因为点方法会再次调用 getattribute 方法, 从而形成循环调用, 程序崩溃