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

顾星河
顾星河
发布时间:2026-10-15| 6人浏览过
原创

本文详解Python中__getattribute__内建属性的工作原理。作为所有类的默认继承基类object提供的拦截器,它允许开发者在属性访问时进行自定义处理。通过重写该方法,可实现权限校验、日志记录等功能,但需注意必须正确调用父类方法并返回结果,否则会导致属性访问失败。

引言

在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,Python 会将 name 作为参数传递给 __getattribute__ 方法。经过一系列处理后,该方法返回处理后的结果。

在Python中,只要定义了继承自object的类,就默认存在属性拦截器。默认情况下,拦截后不进行任何额外操作,直接返回原值。因此,我们可以重写 __getattribute__ 方法来实现特定功能,例如权限检查或打印日志。

2.如果重写了__getattribute__,则类会调用重写后的方法。因此,该方法必须包含return语句,返回传入的属性值,否则调用属性时将导致失败。

3.注意,如果直接使用类名访问类属性(如 Class.attr),则不会调用 __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, **kwargs) 中,传入的参数是属性名,而非属性值。这是一个常见的初学者误区。

2.使用类名调用类属性时,不会经过 __getattribute__ 方法。只有实例对象对属性的调用(包括访问类属性)才会触发该方法。

3.__getattribute__ 是属性拦截器,属性调用会传入该方法进行处理,最后必须有返回值,将处理后的属性返回给调用者。

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

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。