如何在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
相关产品推荐
相关产品推荐

