Python内建属性getattribute拦截器使用详解

 更新时间:2022年05月17日 11:52:40   作者:涤生大数据  
这篇文章主要为大家介绍了Python内建属性getattribute拦截器使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

因为python中所有类默认继承object类。

而object类提供了了很多原始的内建属性和方法,所以用户自定义的类在Python中也会继承这些内建属性。

可以使用dir()函数可以查看,虽然python提供了很多内建属性但实际开发中常用的不多。而很多系统提供的内建属性实际开发中用户都需要重写后才会使用。

对于python来说,属性或者函数都可以被理解成一个属性

1.内建属性__getattribute__的用法

1.重写__getattribute__方法
class Student(object):
    country = "china"  #类属性不会放到__dict__中
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __getattribute__(self, attr): #注意:attr是传入的属性名,不是属性值
        print("开始属性校验拦截功能")
        print(attr)
        return object.__getattribute__(self, attr) #返回属性名
s1 = Student("tom",19)
print(Student.country,s1.country,s1.name,s1.age) #调用属性,会调用__getattribute__方法
'''注意结果,调用了四次属性,但是却只调用了3次 __getattribute__方法。
开始属性校验拦截功能
country
开始属性校验拦截功能
name
开始属性校验拦截功能
age
china china tom 19
'''

分析总结:

  1.__getattribute__ 是属性访问拦截器,就是当这个类的属性被实例访问时,会自动调用类的__getattribute__方法。

当实例调用属性时,比如s1.name,会把name作为实参传进__getattribute__方法中,经过一系列操作后,再把name处理后的结果返回。

Python中只要定义了继承object的类,就默认存在属性拦截器,只不过是拦截后没有进行任何操作,而是直接返回。所以我们可以自己改写__getattribute__方法来实现相关功能,比如查看权限、打印log日志等。

2.如果重写了__getattribute__,则类会调用重写的方法,所以这个方法必须要有renturn返回值,返回传进去的属性,否则调用属性会出现失败的情况。

3.注意如果是直接用类名.类属性的形式调用类属性,是不会调用 __getattribute__方法。

2.重写__getattribute__实现属性拦截功能

class Student(object):
    country = "china"  #类属性不会放到__dict__中
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __getattribute__(self, attr): #注意:attr是传入的属性名,不是属性值
        print("开始属性校验拦截功能")
        print(attr)
        if attr == "name":  #注意这里引用原属性名不用self,直接引号引起来即可。
            print("现在开始调用的是name属性")
        elif attr =="age":
            print("现在开始调用的是age属性")
        else:
            print("现在调用的是其他属性")
        return object.__getattribute__(self, attr) #返回属性名
s1 = Student("tom",19)
print(s1.name,s1.age,s1.country)
'''结果如下:
开始属性校验拦截功能
name
现在开始调用的是name属性
开始属性校验拦截功能
age
现在开始调用的是age属性
开始属性校验拦截功能
country
现在调用的是其他属性
tom 19 china
'''

总结要点:

1.__getattribute__(self,*args,**kwgs)中传入的参数是属性名,不是属值,很多初学者有误区。

2.使用类名调用类属性时,不会经过__getattribute__方法,只争取实例对象对属性的调用,包括调用类属性

3.__getattribute__是属性拦截器,属性调用会传入处理,最后要有返回值,将传入属性处理后返回给调用者。

以上就是Python内建属性getattribute拦截器使用详解的详细内容,更多关于Python内建属性getattribute拦截器的资料请关注脚本之家其它相关文章!

相关文章

  • pandas获取对应的行或者列方式

    pandas获取对应的行或者列方式

    这篇文章主要介绍了pandas获取对应的行或者列方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 基于Python编写简易文字语音转换器

    基于Python编写简易文字语音转换器

    这篇文章主要为大家介绍了如何利用Python编写一个简易文字语音转换器,并打包成exe。文中的示例代码讲解详细,感兴趣的小伙伴快跟随小编一起尝试一下
    2022-03-03
  • python os.system执行cmd指令代码详解

    python os.system执行cmd指令代码详解

    在本篇文章里小编给大家整理的是一篇关于python os.system执行cmd指令代码详解内容,有兴趣的朋友们可以学习下。
    2021-10-10
  • Python3.10中match-case的用法和示例详解

    Python3.10中match-case的用法和示例详解

    在 Python 3.10 中引入了新的 match-case 语法,它是一种用于模式匹配的结构,下面小编就来和大家简单聊聊match-case的用法和示例吧,有需要的小伙伴可以参考下
    2023-10-10
  • Selenium定位浏览器弹窗方法实例总结

    Selenium定位浏览器弹窗方法实例总结

    弹出框是自动化测试中一种常见的元素,这种元素通常是客户端自带的,下面这篇文章主要给大家介绍了关于Selenium定位浏览器弹窗方法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Pandas多级索引的实现示例

    Pandas多级索引的实现示例

    Pandas 中的多级索引是一种强大的工具,用于处理具有多个维度或层次的数据,本文主要介绍了Pandas多级索引的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 利用Python+eval函数构建数学表达式计算器

    利用Python+eval函数构建数学表达式计算器

    Python 中的函数eval()​是一个非常有用的工具。在本文中,云朵君将和大家一起学习 eval() 如何工作,以及如何在 Python 程序中安全有效地使用它,需要的可以参考一下
    2022-09-09
  • OpenCV实现从灰度图像切出Mask前景区域

    OpenCV实现从灰度图像切出Mask前景区域

    本文主要介绍了如何利用OpenCV实现从灰度图像,根据阈值,切出多个前景区域,过滤面积太小的图像。文中的示例代码讲解详细,需要的可以参考一下
    2022-06-06
  • Python中用户输入与while循环详情

    Python中用户输入与while循环详情

    这篇文章主要介绍了Python中用户输入与while循环详情,,包括如何接收用户输入并进行处理,在程序满足一定的条件时让程序一直运行,通过获取用户输入并学会控制程序在用户想要结束时退出循环,即可编写出交互式程序,下文详细内容介绍,需要的朋友可以参考一下
    2022-03-03
  • 在python中安装basemap的教程

    在python中安装basemap的教程

    这篇文章主要介绍了在python中安装basemap的教程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09

最新评论