python支持动态添加实例和类属性,实例属性仅影响当前对象,类属性影响所有实例;使用__slots__会限制实例属性添加;直接操作__dict__存在风险,不推荐常规使用。

Python允许在运行时为实例或类动态添加属性,这是其灵活性的重要体现。关键在于理解实例属性、类属性以及__dict__的作用范围,避免误操作导致意外覆盖或不可预期行为。
为实例动态添加属性
最常见也最安全的方式是直接为对象赋值:
- 实例属性只影响当前对象,不影响其他实例或类本身
- 支持任意合法标识符作为属性名,包括字符串形式的动态名称(用
setattr()) - 例如:
obj.name = "Alice"或setattr(obj, "age", 25)
为类动态添加属性或方法
直接对类名赋值可添加类属性或绑定方法,所有现有及后续实例都会受影响:
- 添加类属性:
MyClass.category = "utility" - 添加普通函数作为方法需显式绑定:
MyClass.new_method = lambda self: print("hello") - 更规范的做法是使用
types.MethodType将函数绑定到类,或直接定义后赋值
注意__slots__的限制
如果类定义了__slots__,则无法动态添加未声明的实例属性:
立即学习“Python免费学习笔记(深入)”;
- 尝试
obj.new_attr = 1会触发AttributeError - 但类属性仍可添加,不受
__slots__约束 - 若需保留动态性,应避免使用
__slots__,或在其中预留字段(如"__dict__")
谨慎使用__dict__直接操作
虽然可通过修改obj.__dict__或cls.__dict__实现底层赋值,但存在风险:
-
__dict__是只读代理(mappingproxy)对于类,不能直接写入;须通过类名赋值 - 对实例操作
__dict__等价于普通赋值,但绕过__setattr__钩子,可能跳过验证逻辑 - 不推荐用于常规开发,适合调试或框架内部机制










