这是我第一个问题的链接:Creating class instance from dictionary?因此,我试图从字典创建类实例,该类实例拥有该类没有的键。例如:

class MyClass(object):
    def __init__(self, value1, value2):
        self.attr1 = value1
        self.attr2 = value2

dict = {'attr1': 'value1', 'attr2': 'value2', 'redundant_key': 'value3'}


在创建类实例之前,我必须从字典中删除此redundant_key

dict.pop('redundant_key', None)
new_instance = MyClass(**dict)


问题是我有几个类和带有很多键的字典(我有几个json格式的响应,表示为dict,我想从这个json响应中创建对象)。我已经从上一个问题中找到了一个临时解决方案-如何删除冗余密钥。我只能使用所需的键从旧字典创建新字典:

new_dict = {key: old_dict[key] for key in allowed_keys}


所以这是代码:

class MyClass(object):
    def __init__(self, value1, value2):
        self.attr1 = value1
        self.attr2 = value2

dict = {'attr1': 'value1', 'attr2': 'value2', 'redundant_key': 'value3'}
new_instance = MyClass(**{key: dict[key] for key in allowed_keys})


我现在需要的只是获取allowed_keys。那么问题来了-有什么方法可以在不创建类实例的情况下获取类实例的属性?

最佳答案

如果您坚持使用过于笼统的字典来初始化对象,则只需定义__init__即可接受但忽略多余的键。

class MyClass(object):
    def __init__(self, attr1, attr2, **kwargs):
        self.attr1 = attr1
        self.attr2 = attr2

d = {'attr1': 'value1', 'attr2': 'value2', 'extra_key': 'value3'}
new_instance = MyClass(**d)


如果您不能修改__init__(看起来好像是从SQLAlchemy声明性基类继承的情况),则添加备用构造函数以接受所有关键字参数,但选择所需的关键字参数。

class MyClass(Base):
    @classmethod
    def from_dict(cls, **kwargs):
        # Let any KeyErrors propagate back to the caller.
        # They're the one who forgot to make sure **kwargs
        # contained the right keys.
        value1 = kwargs['attr1']
        value2 = kwargs['attr2']
        return cls(value1, value2)

new_instance = MyClass.from_dict(**d)

07-24 21:51