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

如何在Python中动态获取对象的@property属性?

动态获取Python对象属性的优化方案

问题背景

我编写了如下Python代码:

class MyObject:
    def __init__(self):
        self._obj1 = "obj1"
        self._obj2 = "obj2"

    @property
    def obj1(self):
        return self._obj1
    @property
    def obj2(self):
        return self._obj2

def get_property(obj, chose):
    if chose == "obj1":
        return obj.obj1
    elif chose == "obj2":
        return obj.obj2

test1 = MyObject()
test2 = MyObject()
config = {"obj1": test1, "obj2":test2}

for key, value in config.items():
    # my_value = value.key  <<- 如何让类似逻辑生效?
    my_value = get_property(value, key)
    print(my_value)

目前需要手动编写带大量分支的get_property函数来匹配属性,希望实现更动态的方式,替代手写分支逻辑。

解决方案

核心方法:使用Python内置getattr()函数

Python内置的getattr()可以直接根据字符串动态获取对象的属性(包括@property装饰的属性),完全替代手写分支的函数,代码更简洁高效:

修改循环部分代码即可:

for key, value in config.items():
    my_value = getattr(value, key)
    print(my_value)

说明:

getattr(obj, attr_name)函数的作用是返回对象obj中名为attr_name的属性值,其中attr_name以字符串形式传入。这正好匹配你通过循环变量key(字符串类型)动态获取对应属性的需求。

注意:value.key这种写法在Python中是直接访问对象value的key属性(字面量属性名),而不是变量key的值对应的属性名,因此无法实现你想要的动态效果,必须使用getattr()来传递变量形式的属性名。

扩展方案:自定义__getattr__方法(复杂场景适用)

如果需要添加自定义的属性获取逻辑(比如属性不存在时的默认值或错误处理),可以在类中重写__getattr__方法,示例如下:

class MyObject:
    def __init__(self):
        self._obj1 = "obj1"
        self._obj2 = "obj2"

    @property
    def obj1(self):
        return self._obj1
    @property
    def obj2(self):
        return self._obj2

    def __getattr__(self, name):
        # 自定义属性不存在时的处理逻辑
        return f"默认值: {name}"
        # 或者抛出异常:raise AttributeError(f"'MyObject' has no attribute '{name}'")

使用时依然通过getattr(value, key)调用,这种方式适合需要统一处理属性获取逻辑的场景。


内容的提问来源于stack exchange,提问作者Rodrigo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 00:03:24