You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:05:01