如何解决如何将字典键值作为属性添加到对象
已经问过这个问题,但是不完全是这样(我无法使用任何答案):我想调用一个返回字典的函数,如果这个字典不是None
,在其上循环并在对象上使用其键+值。注意:此对象来自一个类,其类不能修改。像这样:
def check_ok(s):
return {'prop_1': 'x','prop_2': 'y'}
def check_and_update(obj,st):
result = check_ok(st)
if result is not None:
for k,v in result.items():
obj.k = v # doesn't work,of course
解决方案是什么?
解决方法
您可以通过以下方式实现这一目标:
- 创建自己的课程
- 使用
set_attr
方法将这些值添加到对象的字典中
def check_ok(s):
return {'prop_1': 'x','prop_2': 'y'}
class UpdateableObject(object):
pass
def check_and_update(obj,st):
result = check_ok(st)
if result is not None:
for k,v in result.items():
setattr(obj,k,v)
uob = UpdateableObject()
# Passed None because the `check_ok` functions doesn't use the `st` parameter
check_and_update(uob,None)
# {'prop_1': 'x','prop_2': 'y'}
print(f'{uob.__dict__}')
,
让我解释一下句子“ NB:该对象来自类,不能修改其类。” 含义:您不能修改该类的代码,但修改实例属性即可。
然后,您可以使用attr1: value
attr2: value
interfaces:
[
{'interface_number': 1,'ip': 1.2.3.4,test:test2},{'interface_number': 2,'ip': 2.3.4.5,test:test3},.
.
.
]
修改对象:
setattr
此外,实现尽早停止/退出可能是一个好主意,这取决于您的代码有多长时间(并取决于在这种情况下要执行的操作)。由于“阅读器”不等待/寻找def check_and_update(obj,v)
或elif
子句,因此这消除了代码的一级缩进并使其更易于阅读代码:
else
如果出于某种原因该类的def check_and_update(obj,st):
result = check_ok(st)
if result is not None:
return # or whatever you want to do here
for k,v in result.items():
setattr(obj,v)
实际上是不可变的,则您始终可以尝试从该类继承并覆盖关键部分:
obj
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。