Python中如何在可复用函数里动态操作类属性?
解决Python中动态访问对象属性的问题
当然可行啦!刚接触Python遇到这种动态操作对象属性的需求,踩点小坑很正常,我来给你理清楚问题出在哪,以及怎么解决:
为什么你之前的尝试会出错?
- 你用
o1[keyatt]这种下标方式访问属性,会触发TypeError,因为Python的普通类对象不是可下标访问的容器(比如字典),属性访问默认是用点号(.),比如o1.a,而下标语法是给字典、列表这类结构用的。 - 直接传属性名调用函数却出现
AttributeError,大概率是函数内部还是用了错误的访问方式,或者属性名拼写有误,但核心问题是没用到Python专门的动态属性操作工具。
正确的解决方案:用getattr()和setattr()函数
Python提供了三个专门用于动态属性操作的内置函数,是处理这类需求的标准方式:
hasattr(obj, attr_name):检查对象obj是否存在名为attr_name的属性getattr(obj, attr_name):获取对象obj中attr_name属性的值setattr(obj, attr_name, value):给对象obj的attr_name属性设置value值
完整代码示例
# 先定义你的类 class MyClass: def __init__(self, a, b): self.a = a self.b = b # 改写你的_do_something函数 def _do_something(src_obj, dest_obj, attr_name): # 先检查属性是否存在(可选,但能避免报错) if hasattr(src_obj, attr_name) and hasattr(dest_obj, attr_name): # 获取源对象的属性值 attr_value = getattr(src_obj, attr_name) # 将值设置到目标对象的对应属性 setattr(dest_obj, attr_name, attr_value) else: print(f"警告:对象中不存在属性 '{attr_name}'") # 测试一下 o1 = MyClass(a=100, b=200) o2 = MyClass(a=0, b=0) # 动态传递属性名'a',把o1的a属性值复制给o2 _do_something(o1, o2, 'a') print(o2.a) # 输出:100 # 再传递属性名'b' _do_something(o1, o2, 'b') print(o2.b) # 输出:200
额外提示
如果你的类是继承自dict或者本身就是字典对象,那用下标访问是可行的,但普通自定义类默认不支持,所以还是用上面的三个内置函数更通用。
内容的提问来源于stack exchange,提问作者Frank C.
相关产品推荐
相关产品推荐

