Python如何通过变量动态访问对象属性调用knock_out()方法
问题原因
你写的modeliMLClean.reactions.rx属于静态属性访问写法,Python解析这段代码时,会固定查找reactions对象下名称就叫rx的属性,不会把rx替换成你传入的参数实际存储的字符串值,自然找不到对应反应,达不到动态调用的效果。
正确实现方案
cobra模型的reactions容器本身支持类似字典的下标访问,也可以通过get_by_id()方法传入反应ID获取对应对象,两种写法效果完全一致,是最简便也最符合库设计逻辑的写法,不需要额外封装函数:
# 下标访问写法 for rxn_id in zeroBoth: modeliMLClean.reactions[rxn_id].knock_out() # 等价的get_by_id写法 # for rxn_id in zeroBoth: # modeliMLClean.reactions.get_by_id(rxn_id).knock_out()
如果遇到不支持下标访问的通用场景,也可以用Python内置的getattr()函数实现动态属性获取,适配你原来的函数封装逻辑的代码如下:
def ko(rx): # 动态获取reactions下名称和rx参数值匹配的属性 target_rxn = getattr(modeliMLClean.reactions, rx) target_rxn.knock_out() for x in zeroBoth: ko(x)
鲁棒性优化建议
如果不确定zeroBoth列表里的所有反应ID都在模型中存在,可以加一层存在性判断,避免程序因为找不到反应中途崩溃:
for rxn_id in zeroBoth: if rxn_id in modeliMLClean.reactions: modeliMLClean.reactions[rxn_id].knock_out() else: print(f"跳过不存在的反应:{rxn_id}")
内容的提问来源于stack exchange,提问作者jafemm
相关产品推荐
相关产品推荐

