0

0

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

舞夢輝影

舞夢輝影

发布时间:2026-01-07 13:17:27

|

633人浏览过

|

来源于php中文网

原创

python中动态设置和获取属性核心靠setattr()和getattr():前者按字符串名设属性(支持新增),后者按字符串名取值并可设默认值,二者配合__setattr__和__getattr__可实现属性访问的精细控制。

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!

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

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

立即学习Python免费学习笔记(深入)”;

LogoAi
LogoAi

利用AI来设计你喜欢的Logo和品牌标志

下载
  • 如果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

实际应用场景举例

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

  • 从字典批量初始化对象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,比如误覆写内置属性或拼错字符串名。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

738

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1168

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1163

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

191

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

111

2025.08.07

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号