摘要:在 Python 中,对象的属性既可以直接通过点号赋值,也可以在运行时动态添加或修改。内置函数 setattr 就是用于动态设置对象属性和方法的工具。它是反射机制的重要组成部分,常用于框架、配置管理、插件机制等需要灵活操作属性的场景。
在 Python 中,对象的属性既可以直接通过点号赋值,也可以在运行时动态添加或修改。内置函数 setattr 就是用于动态设置对象属性和方法的工具。它是反射机制的重要组成部分,常用于框架、配置管理、插件机制等需要灵活操作属性的场景。
一、函数语法
setattr(object, name, value)参数:
object:必填,要操作的对象。
name:必填,表示属性或方法名称的字符串。
value:必填,要赋给属性的值或函数名称(或 lambda 表达式)。
返回值:
无返回值(返回 None),仅修改对象的状态。
二、基础用法示例
1、 动态添加属性
class Person:passp = Personsetattr(p, "name", "Alice")print(p.name) # Alice2、修改已有属性
class Person:def __init__(self, name):self.name = namep = Person("Alice")setattr(p, "name", "Bob")print(p.name) # Bob3、动态设置方法
class Greeter:passg = Greetersetattr(g, "say_hi", lambda: "Hello!")print(g.say_hi) # Hello!三、进阶技巧
1、配合 getattr / hasattr 使用
class Person:passp = Personif not hasattr(p, "age"):setattr(p, "age", 20)print(getattr(p, "age")) # 202、使用配置字典批量赋值
settings = {"debug": True, "timeout": 30}class Config:passcfg = Configfor k, v in settings.items:setattr(cfg, k, v)print(cfg.debug, cfg.timeout) # True 303、动态绑定方法到对象
class Person:passdef greet(self):return f"Hello, {self.name}!"# 把函数作为方法挂到类上setattr(Person, "greet", greet)p = Personp.name = "Alice"print(p.greet) # Hello, Alice!四、补充说明
1、与点号赋值的关系
obj.attr = value 等价于 setattr(obj, "attr", value)。
区别在于 setattr 支持动态属性名,可以在运行时确定。
2、属性作用域
若属性已存在,会覆盖旧值。
若属性不存在,会直接添加为新属性。
3、与类的关系
如果作用于类对象,则会影响所有实例(共享类属性或方法)。
如果作用于实例,则只影响该实例自身。
4、反射机制
setattr 与 getattr、hasattr、delattr 一起构成了 Python 的反射机制。它们支持运行时动态地访问、修改和删除属性。
小结
setattr 是 Python 用于动态设置对象属性和方法的内置函数。它不仅可以添加新属性,也可以修改已有属性,还能动态绑定方法。在反射、配置管理和框架开发中,setattr 提供了强大的灵活性,是 Python 动态特性的重要体现。
“点赞有美意,赞赏是鼓励”
来源:得过教育