Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python笔记59-类里面的__getattribute__属性拦截器

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

作者头像
上海-悠悠
发布于 2021-08-20 08:56:39
发布于 2021-08-20 08:56:39
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

前言

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

__getattribute__属性作用

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
# 作者-上海悠悠 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
运行
AI代码解释
复制
0
yoyo
<bound method A.start of <__main__.A object at 0x000001EE977FA940>>

__getattribute__属性拦截器

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 作者-上海悠悠 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
代码运行次数:0
运行
AI代码解释
复制
# 类的属性不调用__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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python学习:内建属性、内建函数的教程
子类没有实现__init__方法时,默认自动调用父类的。 如定义__init__方法时,需自己手动调用父类的 __init__方法。
闻说社
2025/02/25
770
Python学习:内建属性、内建函数的教程
python 中__setattr__, __getattr__,__getattribute__, __call__使用方法
object._getattr_(self, name) 拦截点号运算。当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法。如果继承树可以找到该属性,则不调用此方法 实例instance通过instance.name访问属性name,只有当属性name没有在实例的__dict__或它构造类的__dict__或基类的__dict__中没有找到,才会调用__getattr__。当属性name可以通过正常机制追溯到时,__getattr__是不会被调用的。如果在__getattr__(s
用户1214487
2018/01/24
1.3K0
python笔记60 - 类里面静态方法(@staticmethod),类方法(@classmethod)和实例方法(self)
python 类里面常用的方法有3个:静态方法(@staticmethod),类方法(@classmethod)和实例方法(self) 本篇讲解这3种方法在使用上有什么区别。
上海-悠悠
2021/08/20
9.4K0
五个与Python属性相关的魔术方法
今天要给大家介绍五个魔术方法,他们都与Python属性相关,涉及获取、删除和修改属性,我们一起来看看吧。
罗罗攀
2021/12/06
3340
python笔记58-类里面的__dict__属性
python是面向对象的,对象有属性和方法,可以通过__dict__查看对象的属性
上海-悠悠
2021/08/20
3830
__setattr__,setattr(),getattr__,getattr()及__getattribute__的区别
这里下面用网上比较热的代码进行测试和注释,因本人接触Python不足两星期,若有纰漏,请君不吝赐教;
全栈程序员站长
2022/11/15
4050
测试开发进阶(六)
面向对象编程的三大特征:封装,集成,多态 封装:将数据和方法放在一个类中 继承:python中的一个类可以继承于一个或多个类,被继承的叫父类(基类,base class),继承的类叫子类 多态:一类事物拥有多种形态,一个抽象类有多个子类,(多态的概念依赖于继承),不同的子类对象调用相同的方法,产生不同的执行结果,多态可以增加代码的灵活性 多态 # -*- coding:utf-8 -*- """ @Describe: 0816 @Author: zhongxin @Time: 2019-08-16 20:3
zx钟
2019/08/20
3840
python class 一点总结
Python class 总结 细数class中的 __**__ __init__(self, *values) 对象的初始化函数,初始化类的实例时,会调用这个方法 __str__(self)
ke1th
2018/01/02
6690
Datawhale组队学习 -- Task07:类、对象与魔法方法
对象是类的实例。换句话说,类主要定义对象的结构,然后我们以类为模板创建对象。类不但包含方法定义,而且还包含所有实例共享的数据。
余生大大
2022/11/02
3190
Datawhale组队学习 -- Task07:类、对象与魔法方法
Python - 描述器
我们可以使用 Python 自带的 property 装饰器 来控制属性的访问,下面这个例子通过 property 控制了 Person 的 age 属性的访问和修改
小歪
2019/05/14
8990
深入理解python面向对象-特殊成员(补)
定义一个instance类变量,然后重载__new__方法,这样就能确定此类只创建一个实例,但是返回值是一个实例对象,所以__init__每次还是会被调用。__new__重载方法的返回值有两种方式:
星星在线
2019/06/05
6190
Python基础(10)——属性
子类没有实现__init__方法时,默认自动调用父类的。 如定义__init__方法时,需自己手动调用父类的 __init__方法
羊羽shine
2019/05/28
3230
3.python元类编程
1.1.propety动态属性 在面向对象编程中,我们一般把名词性的东西映射成属性,动词性的东西映射成方法。在python中他们对应的分别是属性self.xxx和类方法。但有时我们需要的属性需要根据其他属性动态的计算,此时如果直接使用属性方法处理,会导致数据不同步。下面介绍@property方法来动态创建类属性。 from datetime import datetime,date class User: def __init__(self,name,birthday): self
zhang_derek
2018/05/30
5390
Python基础---类的内置方法
__init__(): __init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的初始化。注意,这个名称的开始和结尾都是双下划线。 代码例子:
我被狗咬了
2019/09/23
5160
面向对象-魔术方法
拦截点号运算。当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法。如果继承树可以找到该属性,则不调用此方法
星哥玩云
2022/09/08
2730
python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04
首先强调,多态不是一种特殊的语法,而是一种状态,特性(多个不同对象可以相应同一个方法,长身不同的结果)
suwanbin
2019/09/26
7110
python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04
python中__get__,__getattr__,__getattribute__的区别
__get__,__getattr__和__getattribute都是访问属性的方法,但不太相同。  object.__getattr__(self, name)  当一般位置找不到attribute的时候,会调用getattr,返回一个值或AttributeError异常。  object.__getattribute__(self, name)  无条件被调用,通过实例访问属性。如果class中定义了__getattr__(),则__getattr__()不会被调用(除非显示调用或引发AttributeError异常)  object.__get__(self, instance, owner)  如果class定义了它,则这个class就可以称为descriptor。owner是所有者的类,instance是访问descriptor的实例,如果不是通过实例访问,而是通过类访问的话,instance则为None。(descriptor的实例自己访问自己是不会触发__get__,而会触发__call__,只有descriptor作为其它类的属性才有意义。)(所以下文的d是作为C2的一个属性被调用) 
用户1214487
2018/07/31
1.7K0
Python自学成才之路 魔术方法之属性访问控制
其中__getattr__只有在属性不存在时会被调用,__getattribute__无论属性是否存在都会被调用,item参数就是要访问的属性。
我是李超人
2020/08/20
5660
python的__get__、__set
内容:     描述符引导         摘要         定义和介绍         描述符协议         调用描述符         样例         Properties         函数和方法         静态方法和类方法 摘要     定义并展示如何调用描述符,展示自定义描述符和几个内置的python描述符,包括函数、属性、静态方法和类方法,通过给出一个Python的示例应用来展示描述符是如何工作的.     熟练掌握描述符不仅让你拥有python使用的额外技巧,并且可以加深对Python内部如何工作的理解,提升对程序设计的能力,而且体会到python的设计优雅之处 定义和介绍     一般来说,描述符是带有“绑定行为”的对象属性,它的属性访问已经被描述符协议中的方法覆盖了.这些方法是__get__(),__set__(),和__delete__().     如果一个对象定义了这些方法中的任何一个,它就是一个描述符.     默认的属相访问是从对象的字典中 get, set, 或者 delete 属性,;例如a.x的查找顺序是:     a.x -> a.__dict__['x'] -> type(a).__dict__['x'] -> type(a)的基类(不包括元类),如果查找的值是对象定义的描述方法之一,python可能会调用描述符方法来重载默认行为,     发生在这个查找环节的哪里取决于定义了哪些描述符方法     注意,只有在新式类中描述符才会起作用(新式类继承type或者object class)     描述符是强有力的通用协议,属性、方法、静态方法、类方法和super()背后使用的就是这个机制,描述符简化了底层的c代码,并为Python编程提供了一组灵活的新工具 描述符协议
py3study
2020/01/19
1.3K0
python-__getattr__ 和
python3完全使用了新式类,废弃了旧式类,getattribute作为新式类的一个特性有非常奇妙的作用。查看一些博客和文章后,发现想要彻底理解getattr和getattribute的区别,实际上需要理解python中属性的查找顺序、描述器(descriptor)、__get__、__set__、__dict__等知识。
py3study
2020/01/17
4190
相关推荐
Python学习:内建属性、内建函数的教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验