写了一个类,类里面写了几个方法,在调用方法的时候,希望能打印出调用了哪个方法,方便快速定位问题,于是可以用类里面的getattribute属性拦截器。 python的类默认都继承了object类,object提供了了很多原始的内建属性和方法。
__getattribute__
属性作用__getattribute__
属性作用是类实例化调用属性和方法的时候都会调用一次,在object类里面默认是返回该方法的值,没做任何处理
class object:
""" The most base type """
def __getattribute__(self, *args, **kwargs): # real signature unknown
""" Return getattr(self, name). """
pass
__getattribute__
方法默认返回getattr(self, name)
getattr() 函数用于返回一个对象属性值。
getattr(object, name[, default]):
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
class A(object):
count = 0
def __init__(self):
self.name = "yoyo"
self.age = 18
def start(self):
print("start1111111")
a = A()
# 获取属性, 实例方法也是类的属性
print(getattr(a, "count"))
print(getattr(a, "name"))
print(getattr(a, "start"))
运行结果
0
yoyo
<bound method A.start of <__main__.A object at 0x000001EE977FA940>>
__getattribute__
属性拦截器A类实例化对象a,每调用一次属性和方法都会调用一下拦截器,这样方便我们在日志输出的时候,捕获到调用哪些方法,也可以在权限验证的时候,在这里判断有没权限调用对应的方法。
可以通过重写object类的__getattribute__
方法实现属性拦截功能。
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
class A(object):
count = 0
def __init__(self):
self.name = "yoyo"
self.age = 18
def start(self):
print("start1111111")
def __getattribute__(self, item):
"""属性拦截器"""
print("调用了A类的属性:", item)
return object.__getattribute__(self, item)
a = A()
# A()实例对象属性会调用__getattribute__
print(a.count)
print(a.age)
print(a.name)
print(a.start())
A类在调用自身属性的时候,是不会触发__getattribute__
方法
# 类的属性不调用__getattribute__
print(A.count)
需注意的是在定义__getattribute__
方法的时候,只能返回object.__getattribute__(self, item)
不能返回getattr(self, item),这样会进入无限循环,一直反复调用self实例的item属性,导致一直触发这个方法.
2021年第八期《python接口web自动化+测试开发》7.17号开学(课程全面升级!) 加量不加价(新增postman, 赠送selenium和python基础2个课)
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有