news 2026/6/24 0:10:57

Python的getattr()和setattr()的用法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python的getattr()和setattr()的用法

在 Python 中,getattr()setattr()是内置函数,用于动态获取动态设置对象的属性(包括方法,这个要记住,很有用),是实现反射(运行时操作对象属性)的核心工具。

一、基础概念

  • 属性:对象的变量(实例属性 / 类属性)或方法都可视为 “属性”。
  • 动态操作:代码运行时才确定要操作的属性名(而非写死在代码里)。

二、getattr ():动态获取对象属性

1. 语法
getattr(object, name[, default])
  • 参数
    • object:要操作的对象(实例、类、模块等)。
    • name:字符串类型,要获取的属性名。
    • default(可选):属性不存在时返回的默认值;若省略且属性不存在,抛出AttributeError
  • 返回值:属性的值(如果是方法,返回方法对象;调用需加())。
2. 基础用法
示例 1:获取实例属性
class Person: def __init__(self, name, age): self.name = name self.age = age p = Person("Alice", 25) # 静态获取(写死属性名) print(p.name) # Alice # 动态获取(属性名用字符串) print(getattr(p, "name")) # Alice print(getattr(p, "age")) # 25 # 属性不存在时返回默认值 print(getattr(p, "gender", "未知")) # 未知 # 省略默认值,属性不存在则报错 # print(getattr(p, "gender")) # AttributeError: 'Person' object has no attribute 'gender'
示例 2:获取方法(动态调用)
class Calculator: def add(self, a, b): return a + b def multiply(self, a, b): return a * b calc = Calculator() # 动态获取方法并调用 methods = ["add", "multiply", "add", "multiply", "add"] method_name = methods[2] # 运行时确定方法名 # 动态调用对象的方法 print(getattr(calc, method_name)(4, 6))
示例 3:获取模块属性
import math # 动态获取模块的属性 print(getattr(math, "pi")) # 3.141592653589793 print(getattr(math, "sqrt")(16)) # 4.0

三、setattr ():动态设置对象属性

1. 语法
setattr(object, name, value)
  • 参数
    • object:要操作的对象。
    • name:字符串类型,要设置的属性名。
    • value:要给属性赋值的内容(可以是任意类型:数值、字符串、方法、函数等)。
  • 返回值:None。
2. 基础用法
示例 1:设置实例属性
class Person: def __init__(self, name): self.name = name p = Person("Bob") print(p.name) # Bob # 静态设置 p.age = 30 print(p.age) # 30 # 动态设置 setattr(p, "age", 35) print(p.age) # 35 # 设置不存在的属性(自动新增) setattr(p, "gender", "男") print(p.gender) # 男
示例 2:动态绑定方法到对象
class Dog: def __init__(self, name): self.name = name # 定义一个外部函数 def bark(self): print(f"{self.name} 汪汪叫!") dog1 = Dog("旺财") # 动态绑定方法到实例 setattr(dog1, "bark", bark) dog1.bark(dog1) # 旺财 汪汪叫!(注意:实例方法需手动传self) # 绑定到类(所有实例共享) setattr(Dog, "bark", bark) dog2 = Dog("来福") dog2.bark() # 来福 汪汪叫!

四、常见应用场景

1. 配置解析(动态映射配置项)
class Config: def __init__(self): self.host = "127.0.0.1" self.port = 8080 # 模拟配置文件(键值对) config_dict = {"host": "localhost", "port": 9090, "timeout": 30} cfg = Config() # 动态将配置字典的键值对设置为对象属性 for key, value in config_dict.items(): setattr(cfg, key, value) print(getattr(cfg, "host")) # localhost print(getattr(cfg, "timeout")) # 30
2. 序列化 / 反序列化(动态处理对象属性)
def obj_to_dict(obj): """对象转字典(动态获取属性)""" result = {} # 遍历对象的所有属性(排除内置属性) for attr in dir(obj): if not attr.startswith("__"): result[attr] = getattr(obj, attr) return result class User: def __init__(self, id, name): self.id = id self.name = name user = User(1, "张三") print(obj_to_dict(user)) # {'id': 1, 'name': '张三', ...}
3. 插件系统(动态加载插件方法)
class PluginManager: def __init__(self): self.plugins = {} def load_plugin(self, plugin_name, plugin_func): # 动态注册插件(设置属性) setattr(self, f"plugin_{plugin_name}", plugin_func) self.plugins[plugin_name] = plugin_func def run_plugin(self, plugin_name, *args): # 动态执行插件(获取属性) plugin = getattr(self, f"plugin_{plugin_name}", None) if plugin: return plugin(*args) else: raise ValueError(f"插件 {plugin_name} 未找到") # 定义插件函数 def hello_plugin(name): return f"Hello, {name}!" pm = PluginManager() pm.load_plugin("hello", hello_plugin) print(pm.run_plugin("hello", "Python")) # Hello, Python!

五、注意事项

  1. 属性名必须是字符串getattr()/setattr()name参数必须是字符串,不能直接传变量名。
  2. 避免覆盖内置属性:动态设置属性时,不要覆盖对象的内置属性(如__init____dict__),否则可能导致对象异常。
    p = Person("Alice", 25) setattr(p, "__init__", lambda self: None) # 不推荐!会破坏类的初始化逻辑
  3. 默认值的使用getattr()建议始终传入default,避免属性不存在时抛出异常(除非明确希望报错)。
  4. 方法与函数的区别:动态获取方法时,实例方法需要绑定到对象(或手动传self),类方法 / 静态方法可直接调用。

六、总结

函数作用核心场景
getattr()动态获取对象属性 / 方法运行时不确定属性名、插件调用
setattr()动态设置 / 新增对象属性配置映射、动态绑定方法

这两个函数是 Python 反射机制的核心,能极大提升代码的灵活性,尤其适用于需要动态处理对象属性的场景(如框架开发、配置管理、插件系统等)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 10:37:22

深度解密:TensorFlow艺术生成双雄StyleNet与DeepDream实战指南

深度解密:TensorFlow艺术生成双雄StyleNet与DeepDream实战指南 【免费下载链接】tensorflow_cookbook Code for Tensorflow Machine Learning Cookbook 项目地址: https://gitcode.com/gh_mirrors/te/tensorflow_cookbook 你是否曾幻想过让AI帮你将梵高的艺术…

作者头像 李华
网站建设 2026/6/23 18:18:05

全网最全——BMS原理之不平衡电桥法

目录 原理介绍 测量方法 公式推导方法1 公式推导方法2 名词解释 电力行业中,绝缘检测是常见的监测手段,主要负责检测电路中的绝缘情况,若本该绝缘的情况出现了不绝缘或者其他失灵情况,电路采集到的信号会立马出现异常。 原理…

作者头像 李华
网站建设 2026/6/23 18:18:40

使用Hopfield神经网络解决旅行商问题

使用Hopfield神经网络解决旅行商问题(TSP)。这是一种经典的神经网络优化方法。 Hopfield神经网络基础 Hopfield网络是一种递归神经网络&#xff0c;具有能量函数&#xff0c;能够收敛到局部最小值。 classdef HopfieldNetwork < handlepropertiesnum_neurons % 神经元数…

作者头像 李华
网站建设 2026/6/23 19:46:08

基于STM32的温湿度、甲醛、PM2.5空气质量检测系统全套资料及功能详解

基于STM32的温湿度、甲醛、PM2.5空气质量检测系统采集设计资料&#xff0c;联系赠送答辩模板等全套资料。 主要功能: 使用STM32为主控制器&#xff0c;可采集当前环境下的温湿度、甲醛、PM2.5值&#xff0c;当采集值超过预设阀值时&#xff0c;蜂鸣器自动报警。 采集到的温湿度…

作者头像 李华
网站建设 2026/6/23 19:43:55

40、Linux 软件开发与应用全解析

Linux 软件开发与应用全解析 1. C 源代码编译基础 在编译 C 源代码时,可在 C 预处理器标志(CPPFLAGS)中包含路径选项。同时要记住,可能还需要 -L 链接器标志来配合头文件使用。 若看起来没有缺少某个库,有可能是在尝试为源代码不支持的操作系统进行编译。此时可检查 Ma…

作者头像 李华
网站建设 2026/6/23 19:49:10

Code Llama-7b-hf 代码智能助手:从零开始掌握AI编程神器

Code Llama-7b-hf 代码智能助手&#xff1a;从零开始掌握AI编程神器 【免费下载链接】CodeLlama-7b-hf 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/CodeLlama-7b-hf 还在为重复的编码任务烦恼吗&#xff1f;Code Llama-7b-hf 作为Meta推出的专业代码生成…

作者头像 李华