这是我第一个问题的链接: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 格式的响应,表示为字典,我想从这个 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)
