在 Python 中,对象的属性既可以直接通过点号赋值,也可以在运行时动态添加或修改。内置函数 setattr() 就是用于动态设置对象属性和方法的工具。它是反射机制的重要组成部分,常用于框架、配置管理、插件机制等需要灵活操作属性的场景。

一、函数语法

setattr(object, name, value)

参数:

object:必填,要操作的对象。

name:必填,表示属性或方法名称的字符串

value:必填,要赋给属性的值或函数名称(或 lambda 表达式)。

返回值:

无返回值(返回 None),仅修改对象的状态。

二、基础用法示例

1、 动态添加属性

class Person:
    pass

p = Person()
setattr(p, "name", "Alice")
print(p.name)  # Alice

2、修改已有属性

class Person:
    def __init__(self, name):
        self.name = name

p = Person("Alice")
setattr(p, "name", "Bob")
print(p.name)  # Bob

3、动态设置方法

class Greeter:
    pass

g = Greeter()
setattr(g, "say_hi", lambda: "Hello!")

print(g.say_hi())  # Hello!

三、进阶技巧

1、配合 getattr() / hasattr() 使用

class Person:
    pass

p = Person()
if not hasattr(p, "age"):
    setattr(p, "age", 20)

print(getattr(p, "age"))  # 20

2、使用配置字典批量赋值

settings = {"debug": True, "timeout": 30}

class Config:
    pass

cfg = Config()
for k, v in settings.items():
    setattr(cfg, k, v)

print(cfg.debug, cfg.timeout)  # True 30

3、动态绑定方法到对象

class Person:
    pass

def greet(self):
    return f"Hello, {self.name}!"

# 把函数作为方法挂到类上
setattr(Person, "greet", greet)

p = Person()
p.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 动态特性的重要体现。

点赞有美意,赞赏是鼓励