python属性拦截器__getattribute__

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 方法, 从而形成循环调用, 程序崩溃

你可能感兴趣的:(python属性拦截器__getattribute__)