如何将字典键值作为属性添加到对象

时间:2020-08-26 14:49:46

标签: python python-3.x dictionary object attributes

已经问过这个问题,但是不完全是这样(我无法使用任何答案):我想调用一个返回字典的函数,如果这个字典不是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

解决方案是什么?

2 个答案:

答案 0 :(得分:3)

您可以通过以下方式实现这一目标:

  1. 创建自己的课程
  2. 使用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__}')

答案 1 :(得分:1)

让我解释一下句子“ 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, st): result = check_ok(st) if result is not None: for k, v in result.items(): setattr(obj, k, 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, k, v) 实际上是不可变的,则您始终可以尝试从该类继承并覆盖关键部分:

obj