Python 的内置函数 getattr

作者:IMPYLH日期:2025/11/6

Python 内建函数列表 > Python 的内置函数 getattr

1def getattr(obj, name:str):
2    '''
3    获取属性的值
4
5    :param obj: 一个对象
6    :param name: 属性的名字
7    '''
8

Python 的内置函数 getattr 是一个非常有用的反射工具,主要用于动态获取对象的属性或方法。其基本语法为:getattr(object, name[, default]),其中 object 是目标对象,name 是属性/方法名称字符串,default 是可选参数,当属性不存在时返回该值而不是抛出 AttributeError。

具体功能和使用场景如下:

  1. 基本属性获取
    可以直接获取对象属性,等价于 object.name 的点号访问方式,但更加动态灵活:
1class Person:  
2    def __init__(self):  
3        self.name = "Alice"  
4p = Person()  
5print(getattr(p, "name"))  # 输出 "Alice"  
  1. 方法动态调用
    可以获取并调用对象方法。这在需要根据运行时条件选择不同方法时特别有用:
1method = getattr(p, "greet", None)  
2if callable(method):  
3    method()  
  1. 默认值处理
    当属性不存在时,可以指定默认返回值而不引发异常:
1age = getattr(p, "age", 25)  # 如果p没有age属性则返回25  

典型应用场景包括:

  1. 插件系统开发,动态加载模块和函数
  • 在IDE开发中实现代码提示插件,通过反射动态加载不同语言的分析器
  • 游戏引擎中的Mod系统,运行时加载玩家自定义的脚本模块
  • 企业级应用的扩展点机制,如ERP系统通过反射加载不同供应商的对接模块
  1. 实现类似 switch-case 的功能结构
  • 命令模式解析器,根据输入指令字符串反射调用对应的处理方法
  • 状态机实现,通过反射自动匹配状态转换方法
  • REST API路由分发,将HTTP方法(GET/POST)和路径映射到控制器方法
  1. 配置文件驱动的方法调用
  • 定时任务调度系统,通过配置文件指定要执行的任务类和方法
  • 数据转换管道,配置文件中定义转换步骤对应的处理方法
  • 自动化测试框架,通过测试用例配置反射调用测试方法
  1. 对象序列化/反序列化工具
  • JSON/XML转换库,通过反射分析对象属性进行序列化
  • ORM框架,将数据库记录反射映射到实体对象
  • 分布式RPC框架,方法参数和返回值的自动序列化
  • 深度克隆工具,通过反射递归复制对象所有字段

注意:相比直接访问对象属性(如 obj.attribute),使用 getattr 函数(如 getattr(obj, 'attribute'))会带来额外的性能开销。这主要是因为:

  1. 查找机制差异getattr 需要通过字符串名称在运行时动态查找属性,涉及额外的哈希计算和字典查找操作。
  2. 函数调用成本:作为内置函数,getattr 会产生函数调用的开销,包括参数传递和栈帧创建。
  3. 异常处理:当属性不存在时,getattr 默认会抛出 AttributeError,异常处理机制也会消耗资源。

在性能关键场景(如高频循环、实时系统、游戏引擎等)中,建议:

  • 优先使用直接属性访问
  • 可将频繁访问的属性缓存到局部变量
  • 如需动态访问,可考虑预先建立 {name:attr} 的映射字典

示例对比:

1# 直接访问(推荐)
2value = obj.attr
3
4# 动态访问(灵活但较慢)
5value = getattr(obj, 'attr')
6

当确实需要动态属性访问时(如实现插件系统、ORM映射等),getattr 的灵活性优势可能超过其性能代价。


Python 的内置函数 getattr》 是转载文章,点击查看原文


相关推荐


Flash游戏破解参考
FD_20132025/11/1

编 者按:工作、学习之余,玩一会Flash小游戏,放松一下紧绷的神经,是不少朋友的最爱。不过,大部分Flash小游戏并不提供SWF文件的下载,想玩游 戏就必需打开网页,也给我们带来了不小的麻烦。当然,小小的问题难不倒我们,通过各种途径,我们依然可以获取各种被加密的SWF文件,从而无需联网,便能 在本地运行Flash小游戏。 对症下药,玩转Flash游戏下载 Flash游戏下载,关键便在于获取SWF文件的真实URL地址。由于不同类型的Flash游戏,采用的加密、运行方式各不相同,因此必需采


南京大学LLM开发基础(四)MoE, LoRA, 数的精度 + MLP层实验
nju_spy2025/10/30

https://njudeepengine.github.io/llm-course-lecture/2025/lecture8.html#1 目录 1. Mixture-of-experts (MoE) 1.1 优势 1.2 结构 1.3 训练 2. Low-rank adaptation (LoRA) 3. 数的精度 -- 混合精度 + 量化操作 Task1:DenseMLPWithLoRA 一、任务背景 二、任务要求 Task2:Sparse MLP 1.


【C++list】底层结构、迭代器核心原理与常用接口实现全解析
m0_748233642025/10/27

一、官方源码的探究 在实现list的底层前,我们先看下官方的核心成员变量,link_type node,其中link_type是list_node*,也就是说是节点的指针 在这里插入图片描述 下面我们看下其的初始化,在空初始化中,链表为空并不是把节点的指针给成空,而是给了个节点,让其的前驱指针和后继指针均指向自己,在C语言阶段的数据结构中我们便知道这个节点是哨兵位头节点 注意: 这里创捷新的节点不是new的,而是使用get_node出来的,这里是由于内存池的原因,后续再介绍


从复杂到高效:QtitanNavigation助力金融系统界面优化升级
Aevget2025/10/24

QtitanNavigation 组件模拟Microsoft Dynamics CRM-2016 / Office 365导航界面和一组控件,来改善Qt.C ++应用程序的用户体验。QtitanNavigation结合用户界面构建“Ribbon UI”和“Side Bar”的各种示例,可以更好地在您的应用程序中导航,使用户更直观地访问应用程序的某些部分。因此,它允许同时显示更多的信息,并让您高效地查看所有实体(工作区域,网格或其他项目),滚动次数更少,点击次数更少。与我们的其他解决方案一样,Qt


Rust 与 Go – 比较以及每个如何满足您的需求
std78792025/10/22

Rust 和 Go 是新的编程语言。每个都解决了以前编程语言(例如 C 和 C++)固有的问题。 如果您不确定哪一个适合您的项目,请查看这篇比较文章,我们将在其中更深入地研究 Rust 与 Go。 在比较结束时,您将清楚地了解 Rust 和 Go 提供的功能。我们将介绍它们的主要特点、优缺点、异同,并根据您的要求讨论正确的选择。 除此之外,我们还将争辩说,大多数团队可能能够同时使用这两种语言来支持他们的应用程序,并且比只坚持使用一种编程语言获得好处。 那么,为什么还要等呢?让我们


node.js上传图片接口
郏国上2025/10/21

node.js需要使用koa-multer库来实现上传图片接口。 实际上先通过koa-multer下载到本地指定目录,然后上传到阿里云(部分格式图片需要转换成网络格式图片jgp再上传)。 首先在系统启动文件引入注册路由: app.use(BodyParser({ 'formLimit':'3mb', 'jsonLimit':'3mb', 'textLimit':'3mb' })); // 注意顺序,必须body parser在前, router在后 app.use(rou


SpringBoot的学习
ʚ希希ɞ ྀ2025/10/20

学习目标: 1.掌握基于SpringBoot框架的程序开发步骤 2.熟练使用SpringBoot配置信息修改服务器配置 3.基于SpringBoot的完成SSM整合项目开发 下图创建一个Spring模块: 下图是一个SpringBoot程序最基本的架子: 如下一个SpringBoot程序就开发好了。 SpringBoot程序之所以好用是因为pom文件中的继承和一个dependency: 最后运行Application类: Spring程序和S


小杰深度学习(sixteen)——视觉-经典神经网络——MobileNetV2
jie*2025/10/19

7.MobileNetV2 1. 网络的背景 MobileNetV1 还不够轻量和高性能,为了让移动设备有更好的体验,Google 团队提出了 MobileNetV2 架构 MobileNetV2网络是由谷歌团队在2018年提出的,它相对于MobileNetV1而言,有着更高的准确率和更小的网络模型。 论文地址:https://arxiv.org/abs/1801.04381 Inverted Residuals and Linear Bottlenecks.pdf 2. 网络的


C#:函数默认参数
曹牧2025/10/17

C#函数默认参数允许在方法定义时为参数指定默认值,当调用时未提供该参数值则自动使用默认值:    ‌1、基本语法‌     在方法声明中通过参数名=默认值形式定义,例如void Print(string msg="default")。调用时可省略有默认值的参数Print(),此时msg取值为"default"。    ‌2、使用规则‌         默认参数必须从右向左连续定义,即某个参数有默认值后,其右侧所有参数必须都有默认值        默认值必须是编译时常量,不支持运行时动态赋值


【项目实战 Day12】springboot + vue 苍穹外卖系统(Apache POI + 工作台模块 + Excel表格导出 完结)
Roye_ack2025/10/16

目录 一、工作台模块 1、查询今日运营数据 - GET接口 (1)需求分析 (2)代码开发 2、查询今日运营数据 - GET接口 (1)需求分析 (2)代码开发 3、查询菜品总览 - GET接口 (1)需求分析 (2)代码开发 4、查询套餐总览 - GET接口 (1)需求分析 (2)代码开发 二、Excel表格导出 1、Apache POI (1)入门案例 2、导出Excel表格模块 (1)需求分析 (2)代码开发 【1】导入excel模板文件 【2】c

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0