第8.25节 Python风格的__getattribute__属性访问方法语法释义及使用

python中那些双下划线开头得函数和变量 如果要创建自己的类,且对象之间的比较有意义,可以使用下面的特殊方法来实现比较。方法,在 每次引用属性或方法名称时 Python 都调用它(特殊方法名称除外,因为那样将会导致讨厌的无限循环)。因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。要重建序列化对象,Python 需要创建一个和被序列化的对象看起来一样的新对象,然后设置新对象的所有属性。方法允许将 color 列为可用属性,对于想使用你的类但却不想深入其内部的人来说,该方法非常有益。 阅读详情

一、 引言
在《第8.13节 Python类中内置方法__repr__详解》老猿介绍了在命令行方式直接输入“对象”就可以调用repr内置函数或__repr__方法查看对象属性数据,实际上该过程除了调用repr内置函数或__repr__方法外,还调用了一个内置方法__getattribute__,正是通过该方法Python获取了对象的信息进行输出。
二、 __getattribute__语法释义
__getattribute__方法是一个实例方法,object基类中定义了该方法,任何属性调用该方法都能返回属性(包括方法)对应的数据,实际上在Python交互式环境命令行中输入对象直接回车返回信息,实际上就是调用该方法获取到repr方法返回的信息展示的。
调用语法:
实例.getattr( 属性名)

其中self表示实例自身,“属性名”是属性的名字,为字符串定义的属性名字。
三、 案例代码及截屏

>>> class Car(Vehicle):
    def __init__(self, power):
        print("In Car init,objectid = {:#016X}".format(id(self)))
        self.power = power
        self.totaldistance = 0
    def drive(self,distance):self.totaldistance += distance

    
>>> car = Car('汽油发动机')
In Car init,objectid = 0X000000038B1128
>>> car.__getattribute__('power')
'汽油发动机'
>>> car.__getattribute__('drive')
<bound method Car.drive of <__main__.Car object at 0x00000000038B1128>>
>>> car.power
'汽油发动机'
>>> car.drive
<bound method Car.drive of <__main__.Car object at 0x00000000038B1128>>
>>>

在这里插入图片描述

可以看到,“实例.getattr( 属性名)”与“实例.属性”的执行结果完全相同,实际上这种“实例.属性”的查看模式调用的就是“实例.getattr( 属性名)”名来实现的。
本节简单介绍了__ getattribute __方法,内容比较简单,但确实该方法是非常符合Python风格的,每种简单后面都有对应的支撑机制。下节将继续介绍怎么实现该方法的重写以支持开发人员自己的访问控制。
老猿Python,跟老猿学Python!
博客地址:https://blog.youkuaiyun.com/LaoYuanPython

请大家多多支持,点赞、评论和加关注!谢谢!

Python中的__getattribute__属性访问方法详解 在上面的示例代码中,定义了一个名为MyClass的类,其中包含一个实例变量x和一个__getattribute__()方法。在__getattribute__()方法中,如果访问的属性名为’y’,则返回x的平方;需要注意的是,如果在__getattribute__()方法中直接获取属性值,可能会导致无限递归调用,从而引起程序崩溃。可以看到,在访问obj.y时,实际上返回的是x的平方。这说明,通过重写__getattribute__()方法,我们可以实现对属性访问行为的自定义控制,以满足特定的需求。 阅读详情

相关推荐

Python高频面试题10 - 讲一下__getattr__ vs __getattribute__ 的区别

Python高频面试题10 - 讲一下__getattr__ vs __getattribute__ 的区别

孤寒者的博客 2万+

python 中的__getattr__和__getattribute__方法

python 中的__getattr__和__getattribute__方法的理解

qq_43745578的博客 1964

Python中的属性访问方法__getattribute__详解及使用

在Python中,__getattribute__是一个特殊的方法,用于定义对类的属性进行访问时的行为。它在属性访问过程中被隐式调用,允许我们自定义属性访问的行为。本文将详细介绍__getattribute__的语法和使用方法,并提供相应的源代码示例。通过重写该方法,我们可以根据属性名来定义不同的访问逻辑。它在属性访问过程中被隐式调用,仅在找不到指定属性时才会被调用。方法,那么它会在任何属性访问时被调用,而不仅仅是未定义的属性。方法,并根据属性名自定义了不同的访问行为。方法,以获取默认的属性访问行为。

2301_79366435的博客 349

Python:getattr()函数和__getattribute__()魔术方法

Python内置函数getattr()用于动态获取对象属性,支持通过字符串指定属性名,比点运算符更灵活。其语法为getattr(object, name[, default]),当属性不存在时可返回默认值。文章通过Person类示例展示了getattr()在动态属性访问中的优势,并对比了点运算符的局限性。同时深入解析了getattr()底层调用__getattribute__()的机制,以及__getattr__()方法在属性不存在时的处理逻辑。

保持终身学习的能力,温故而知新 1706

MATPOWER的安装详细教程

MATPOWER的安装包实际为一个程序包,安装教程很简单,详见本文。

半个月亮Zz的博客 3万+

2023-2024深度学习框架之争——选pytorch还是tensorflow?

深度学习是人工智能领域的一个重要分支,它利用多层神经网络来模拟人类的学习和推理能力,解决各种复杂的问题,如图像识别、自然语言处理、语音识别、推荐系统等。深度学习框架是一种软件工具,它提供了构建、训练、测试和部署深度学习模型的便利,使得开发者和研究者可以更高效地进行深度学习的开发和应用。目前,市场上有许多不同的深度学习框架,如PyTorch、TensorFlow、Keras、MXNet、Caffe2等,它们各有优劣,适用于不同的场景和需求。

flchen_nchu的博客 6756

lesson27:Python属性访问魔法:深入理解__getattr__与属性控制机制

摘要: 本文系统解析Python属性访问的底层机制,重点探讨__getattr__、__getattribute__和__setattr__三大魔法方法。__getattr__处理缺失属性,适用于动态属性和优雅降级;__getattribute__拦截所有属性访问,适合日志审计等场景但需警惕递归风险;__setattr__则全面控制属性赋值,支持数据验证和转换。文章还提供高级组合模式、常见陷阱规避及性能优化策略,强调合理使用这些机制能实现灵活类设计,同时需平衡动态性与代码可维护性。理解属性查找链(数据描述符

2402_82363599的博客 1172

逐行逐句进一步了解SurroundOcc(一)

通过分析中的模型构建过程,理解了从配置文件到模型实例化的整个流程。构建过程的核心是通过build和等函数,逐步将配置文件解析并生成模型的各个模块对象,最终组合成一个完整的模型结构。这一过程涉及多个类和函数的调用,其中函数是生成对象的关键,它能够从配置字典中提取必要信息并生成对应的类实例。

lovely_yoshino的博客 8112

第8章 Python类中常用的特殊变量和方法目录

第8章 8.1节 Python类中常用的特殊变量和方法 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解 第8.4节 Python类中不是构造方法却胜似构造方法的__new方法__深入剖析:语法释义 第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执...

老猿Python 1557

「Unity3D」Addressable版本冲突解析:SBP与Addressables兼容性问题实战指南

本文深入解析Unity3D中Addressable与SBP(Scriptable Build Pipeline)版本冲突问题,提供实战解决方案。当遇到「Build Task CreateBuiltInShadersBundle failed」错误时,可通过版本匹配、临时资源引用或构建参数调整解决。文章详细分析兼容性原理,并给出版本组合指南与最佳实践,帮助开发者高效处理资源构建问题。

weixin_29001683的博客 410

46、大数据助力SDN优化流量管理与控制器

本文探讨了大数据在软件定义网络(SDN)中的应用,重点分析了如何利用大数据技术优化SDN控制器的可扩展性和弹性。通过介绍SDN控制器的核心功能及其面临的挑战,提出了集中式、分布式、混合式和分层式控制器放置策略,并结合大数据分析系统架构与技术,详细阐述了在控制器放置优化、流聚合和备份路径识别等场景中的实际应用。文章还给出了大数据分析在SDN控制器优化中的操作流程与优势,展望了未来结合人工智能与物联网的发展方向,强调了数据安全与算法效率的重要性。

xx56789的博客 86

Python高级编程——描述符Descriptor超详细讲解(上篇之属性优先级)

送你小心心记得关注我哦!!进入正文全文摘要描述符descriptor,是python语言的重要特性,上上一个系列文章专门讲解python高级编程系列之装饰器decorat...

MIss-Y的博客 905

最小二乘拟合圆:使用拉格朗日乘子法

在本文中,我们将探讨如何使用拉格朗日乘子法来进行最小二乘拟合,并将其应用于拟合一个空间圆。首先,我们需要定义问题。给定一组二维或三维数据点,我们的目标是找到一个圆,使得这些数据点到圆的距离的平方和最小。为了找到最小值,我们需要计算拉格朗日函数的偏导数,并令其等于零。通过解决优化问题,我们可以找到最佳拟合的圆,以最小化数据点到圆的距离的平方和。其中,(x, y) 是圆心的坐标,r 是圆的半径,(xi, yi) 是数据点的坐标。其中,g(x, y, r) = 0 是约束条件,C 是常数,λ 是拉格朗日乘子。

TechProX的博客 475

Python类与对象:从语法结构到思维操作系统

在面向对象编程中,'类'与'对象'不仅是代码组织方式,更是建模现实世界的核心抽象机制。其底层原理涉及内存分配(__new__)、状态初始化(__init__)、属性访问协议(__getattribute__)及动态绑定方法等关键环节。Python通过鸭子类型弱化类型约束,强调行为契约而非接口声明,赋予开发者更高灵活性,同时也要求更严谨的数据归属意识(self显式传递)。这种设计在物联网传感器封装、金融账户建模、促销规则DSL等真实场景中展现出强大表达力与工程韧性。理解类的本质,是写出可维护、可扩展、低熵增P

weixin_30905981的博客 390

手写中间件之——并行框架(1 并行框架的应用场景和需求)

我们为什么会需要一个带任务顺序编排的并行框架 1 复杂的微服务系统间调用 经常会有这样的调用场景:app(或web前端)调用后台的一个接口,该接口接到该请求后,需要调用其他多个微服务来获取数据,最终汇总一个最终结果返回给用户。 譬如用户请求“我的订单”,后台在收到请求后,就需要去调用用户详情rpc、商品详情rpc、库存rpc、优惠券rpc等等很多个服务。有些服务是可以并行去请求的,但有些服务...

tianyaleixiaowu的专栏 1万+

secureCRT 破解方法

3、输入注册信息打开keygen.exe,点击path,选择SecureCRT的安装目录(例如D:\VanDykeSoftware\Clients)的securecrt.exe打开,继续下一步打开LicenseHelper.exe,如下。1、注册SecureCRT9.1打开keygen.exe,出现以下问题(没有关掉安全防护,一双击打开,Windows会自动识别keygen.exe为bingdu并删除)打开桌面SecureCRT,此界面不输入内容,直接点击下一步。2、存储配置文件夹(可以默认安装)

逆水行舟 1万+

深入解析Python AttributeError:从属性查找机制到动态编程实践

在Python编程中,对象属性访问是基础且核心的操作。其背后的属性查找机制遵循从实例字典、类字典、继承链到特殊方法(如__getattr__)的完整链路,这构成了Python动态对象模型的基石。理解这一原理对于编写健壮、高效的代码至关重要,它能帮助开发者避免常见的运行时错误,并充分利用语言的动态特性实现灵活的设计模式。在实际工程中,这一机制的价值体现在诸如实现惰性加载、代理模式、数据验证等高级场景。例如,通过合理运用__getattr__方法,可以为不存在的属性提供智能的默认值或实现动态计算,而描述符(De

weixin_34059951的博客 435

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

`魔术方法`(`Magic Methods`):深入解析`__call__`、`__getattr__`、`__getattribute__`和`__slots__`。

掌握这些魔术方法能让你对Python的理解更上一层楼,编写出更灵活、更高效的代码。希望今天的讲解能够帮助你更深入地理解这些概念,并在实际项目中灵活运用。请务必多加练习,才能真正掌握这些技巧。

weixin_41455464的博客 1079

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《Effective Python 编写高质量Python代码的59个有效方法》第四章(共八章)阅读总结

年纪大了,记性不好,老忘,所以在读完这本书后写了这一系列文章,文章中没有任何书中的示例代码,只是对每条知识点的总结。写给自己看,分享给大家看,不足之处欢迎指正。 第四章:元类及属性(总结) 第29条:用纯属性取代get和set方法 从其他语言转入Python的开发者,可能会在类中明确的实现getter和setter方法,作者是从Java转入Python的感受尤为明显。getter和setter用...

qq_41558686的博客 213

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Python学习笔记36:动态属性和特性

Python学习笔记36:动态属性和特性 值得高兴的是,经过一段时间的学习,《Fluent Python》一书的内容只剩下最后一个部分了:元编程。 当然,我同时也发现这本书在中后部的内容难度陡然增加,但是随着书页的变薄,任何读者想必都难免会有喜悦和轻松之感。 闲话少说,进入今天的主题。 任何语言对面向对象的学习都是先介绍类,而类中最开始学的内容必然是属性。Python作为一门动态语言,相比静态语言,在类和对象的属性上面有更多“花样”,值得我们专门花时间总结一下。 属性 Python的类和对象中有一些特殊属性

梦幻天空 670

别再写 if hasattr() 了!Python动态属性检查的5个实战场景与高级用法

本文深入探讨Python动态属性检查的5个高级应用场景,包括插件系统接口检查、JSON数据处理、动态混入模式等,提供了比传统`if hasattr()`更优雅高效的解决方案。通过抽象基类、属性访问协议等技巧,帮助开发者编写更Pythonic且易于维护的代码,同时分析了不同方法的性能差异与优化建议。

weixin_30785593的博客 444

Python的__getattr__方法

例如,当访问obj.undefined时,若类中未定义该属性,Python会尝试调用__getattr__('undefined')。Python中的__getattr__方法是一个强大而灵活的特性,它允许开发者在访问不存在的属性时动态处理请求。代码只需维护一个被代理对象的引用,并在__getattr__中调用getattr(self._wrapped, name)。此技巧在Web开发中尤为实用,能够统一不同数据源的访问方式,同时保持代码的可读性和简洁性。

ifaaav_084的博客 190

解决 ‘chatbot‘ object has no attribute ‘style‘ 错误:高效调试与属性管理实践

在Python项目开发中,尤其是构建聊天机器人(Chatbot)这类涉及复杂状态和配置管理的应用时,开发者经常会遇到类似的错误。这类错误不仅会中断程序运行,更因其定位的隐蔽性,常常消耗开发者大量的调试时间,成为影响开发效率的显著瓶颈。本文将深入剖析这一典型错误的根源,并提供一套从快速调试到根本预防的高效实践方案。

2600_94960058的博客 755

python learning notes

PART I in new-style class, implicit attribute fetch starts at class instead of instance. X[I] is equivalent to X.__getitem__(I) in old-style class. X[I] is equivalent to type(X).__getitem__(X, I) i...

KusanoNEU的博客 424

Python3编程实战:从基础语法到高级特性

Python作为动态类型语言,其核心优势在于简洁的语法和丰富的标准库。通过理解变量动态绑定、鸭子类型等特性,开发者可以快速构建高效应用。在工程实践中,列表推导式、生成器表达式等语法糖能显著提升代码可读性,而装饰器、上下文管理器等高级特性则提供了强大的元编程能力。本文通过变量类型检测、闰年判断等典型示例,演示了Python3在数据处理、算法实现等场景下的最佳实践,特别适合希望从语法学习过渡到实际开发的程序员。

weixin_33907511的博客 345
上一篇: 转:关于Python中的lambda,这篇阅读量10万+的文章可能是你见过的最完整的讲解
下一篇: 关于open函数文件打开模式的有意思的一个现象
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值