前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python笔记59-类里面的__getattribute__属性拦截器

python笔记59-类里面的__getattribute__属性拦截器

作者头像
上海-悠悠
发布2021-08-20 16:56:39
1.4K0
发布2021-08-20 16:56:39
举报
文章被收录于专栏:从零开始学自动化测试

前言

写了一个类,类里面写了几个方法,在调用方法的时候,希望能打印出调用了哪个方法,方便快速定位问题,于是可以用类里面的getattribute属性拦截器。 python的类默认都继承了object类,object提供了了很多原始的内建属性和方法。

__getattribute__属性作用

__getattribute__属性作用是类实例化调用属性和方法的时候都会调用一次,在object类里面默认是返回该方法的值,没做任何处理

代码语言:javascript
复制
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() 函数用于返回一个对象属性值。

getattr(object, name[, default]):

  • object — 对象。
  • name — 字符串,对象属性。
  • default — 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。
代码语言:javascript
复制
# 作者-上海悠悠 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"))

运行结果

代码语言:javascript
复制
0
yoyo
<bound method A.start of <__main__.A object at 0x000001EE977FA940>>

__getattribute__属性拦截器

A类实例化对象a,每调用一次属性和方法都会调用一下拦截器,这样方便我们在日志输出的时候,捕获到调用哪些方法,也可以在权限验证的时候,在这里判断有没权限调用对应的方法。 可以通过重写object类的__getattribute__方法实现属性拦截功能。

代码语言:javascript
复制
# 作者-上海悠悠 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__方法

代码语言:javascript
复制
# 类的属性不调用__getattribute__
print(A.count)

需注意的是在定义__getattribute__方法的时候,只能返回object.__getattribute__(self, item) 不能返回getattr(self, item),这样会进入无限循环,一直反复调用self实例的item属性,导致一直触发这个方法.

2021年第八期《python接口web自动化+测试开发》7.17号开学(课程全面升级!) 加量不加价(新增postman, 赠送selenium和python基础2个课)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • __getattribute__属性作用
  • getattr()函数
  • __getattribute__属性拦截器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档