在 Python 中,对象的属性既可以直接通过点号赋值,也可以在运行时动态添加或修改。内置函数 setattr() 就是用于动态设置对象属性和方法的工具。它是反射机制的重要组成部分,常用于框架、配置管理、插件机制等需要灵活操作属性的场景。
一、函数语法
setattr(object, name, value)参数:
object:必填,要操作的对象。
name:必填,表示属性或方法名称的字符串。
value:必填,要赋给属性的值或函数名称(或 lambda 表达式)。
返回值:
无返回值(返回 None),仅修改对象的状态。
二、基础用法示例
1、 动态添加属性
class Person:
pass
p = Person()
setattr(p, "name", "Alice")
print(p.name) # Alice2、修改已有属性
class Person:
def __init__(self, name):
self.name = name
p = Person("Alice")
setattr(p, "name", "Bob")
print(p.name) # Bob3、动态设置方法
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")) # 202、使用配置字典批量赋值
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 303、动态绑定方法到对象
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 动态特性的重要体现。
“点赞有美意,赞赏是鼓励”
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.