登录
首页 >  文章 >  python教程

Python动态属性教程:setattr与getattr详解

时间:2026-05-12 13:11:39 189浏览 收藏

Python的`setattr()`和`getattr()`是实现动态属性操作的核心内置函数,让开发者能通过字符串名称灵活设置或安全获取对象属性,突破传统点号访问的静态限制;它们不仅支持新增属性、提供默认值、避免运行时错误,还能与`__setattr__`和`__getattr__`协同实现日志记录、类型校验、懒加载等高级控制逻辑,在配置管理、ORM映射、序列化、插件系统和命令行参数绑定等实际场景中发挥关键作用——掌握它们,能让Python代码瞬间变得更灵活、更健壮、也更具工程扩展性。

Python动态属性教程_setattr与getattr用法

Python中动态设置和获取属性,核心靠setattr()getattr()两个内置函数。它们让对象属性的操作不再局限于写死的点号访问,而是能用字符串控制,特别适合配置驱动、序列化、ORM映射或插件系统等场景。

setattr:按名字给对象设属性

setattr(obj, name, value) 等价于 obj.name = value,但name是字符串,可动态生成。

  • 第一个参数必须是**已存在的对象**(不能是类名本身,除非你想改类属性)
  • 第二个参数是**字符串形式的属性名**,支持不存在的属性——会直接新增
  • 第三个参数是任意值,包括函数、lambda、甚至另一个对象

示例:

class Person:
    pass
<p>p = Person()
setattr(p, 'name', 'Alice')
setattr(p, 'age', 30)
setattr(p, 'say_hello', lambda: print('Hi!'))</p><p>print(p.name)        # Alice
print(p.age)         # 30
p.say_hello()        # Hi!
</p>

getattr:安全地按名字取属性值

getattr(obj, name[, default]) 类似 obj.name,但更灵活:支持默认值,且不会因属性不存在而报错。

  • 如果name对应属性存在,返回其值
  • 如果不存在,且提供了default,就返回它(比如None、空列表、0等)
  • 如果没提供default且属性不存在,则抛出AttributeError

常见用法:

# 安全读取配置字段
config = {'host': 'localhost', 'port': 8000}
host = getattr(config, 'host', '127.0.0.1')   # 注意:config是dict,不支持getattr → 这里应是自定义对象
# 正确做法:先定义类或使用types.SimpleNamespace
from types import SimpleNamespace
cfg = SimpleNamespace(host='localhost', port=8000)
host = getattr(cfg, 'host', '127.0.0.1')      # 'localhost'
timeout = getattr(cfg, 'timeout', 30)        # 30(默认值)

配合__setattr__和__getattr__实现更精细控制

仅靠setattr/getattr是外部操作;若想在属性被设或取时自动触发逻辑(如日志、类型检查、懒加载),需重写特殊方法:

  • __setattr__(self, name, value):每次self.x = ysetattr(self, ...)都会调用它
  • __getattr__(self, name):仅当属性**确实不存在**时才被调用(注意不是__getattribute__

小提醒:重写__setattr__时,记得用super().__setattr__(...)赋值,否则可能无限递归。

class LoggedPerson:
    def __setattr__(self, name, value):
        print(f'Setting {name} = {value}')
        super().__setattr__(name, value)  # 关键:用super避免递归
<p>p = LoggedPerson()
p.name = 'Bob'  # 输出:Setting name = Bob
</p>

实际应用场景举例

这些函数不是炫技,而是解决真实问题的工具:

  • 从字典批量初始化对象for k, v in data.items(): setattr(obj, k, v)
  • 实现简易ORM字段映射:把数据库列名转为对象属性,用getattr(row, 'user_id')取值
  • 命令行参数绑定到对象:argparse结果用setattr(cfg, opt.dest, opt.value)存入配置对象
  • 插件式功能注册:根据字符串名动态挂载处理函数:setattr(self, 'on_save', handler_func)

不复杂但容易忽略。用对了,代码立刻变灵活;乱用则容易引发隐晦bug,比如误覆写内置属性或拼错字符串名。

今天关于《Python动态属性教程:setattr与getattr详解》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>