Python 从字典创建类实例?

Python 从字典创建类实例?,python,class,dictionary,sqlalchemy,Python,Class,Dictionary,Sqlalchemy,我试图从字典中创建一个类实例,它的键多于类的属性。我已经从这个链接上阅读了关于同一问题的答案:。问题是,我无法按照自己的意愿在类定义中编写\uuuu init\uuuu,因为我使用的是SQLAlchemy声明式类定义。另外,type('className',(object,),dict)创建了不需要的错误属性。 以下是我找到的解决方案: dict = {'key1': 'value1', 'key2': 'value2'} object = MyClass(**dict) 但是,如果dict具

我试图从字典中创建一个类实例,它的键多于类的属性。我已经从这个链接上阅读了关于同一问题的答案:。问题是,我无法按照自己的意愿在类定义中编写
\uuuu init\uuuu
,因为我使用的是SQLAlchemy声明式类定义。另外,
type('className',(object,),dict)
创建了不需要的错误属性。 以下是我找到的解决方案:

dict = {'key1': 'value1', 'key2': 'value2'}
object = MyClass(**dict)
但是,如果dict具有冗余密钥,则无法工作:

dict = {'key1': 'value1', 'key2': 'value2', 'redundant_key': 'redundant_value'}
object = MyClass(**dict) # here need to ignore redundant_key
除了直接从dict中删除所有冗余密钥之外,还有其他解决方案吗?

另一种解决方案是:


使用
classmethod
过滤dict并返回对象

然后,您不必强制您的
\uuuu init\uuu
方法接受dict

import itertools

class MyClass(object):
    @classmethod
    def fromdict(cls, d):
        allowed = ('key1', 'key2')
        df = {k : v for k, v in d.iteritems() if k in allowed}
        return cls(**df)

    def __init__(self, key1, key2):
        self.key1 = key1
        self.key2 = key2

dict = {'key1': 'value1', 'key2': 'value2', 'redundant_key': 'redundant_value'}

ob = MyClass.fromdict(dict)

print ob.key1
print ob.key2

对象的一种特殊python魔法方法是
object.\uuu dict\uuuu
“用于存储对象(可写)属性的字典或其他映射对象。” 因此,通过提升此功能

class MyClass(object):
   def __init__(self, **entries):
      self.__dict__.update(entries))

dict = {'key1': 'value1', 'key2': 'value2', 'redundant_key': 'redundant_value'}

ob = MyClass(**dict)

注意:它不处理嵌套字典…

什么是
冗余\u键
?您想如何为
MyClass
编写
\uuuuuuuu init\uuuuuu>?抱歉,我不熟悉SQLAlchemy声明式类定义。@RafaelCardoso冗余_键是字典中存在的键,但是在类属性中不存在。@PaulRooney
\uuuuu init\uuuuuuuu
用于MyClass,例如在这个答案中,这样您就知道将输入哪些键了?然后在您的uuu init\uu函数中添加一行,如:
self.\uu dict\uuu.update(dict\u you想要)
class MyClass(object):
   def __init__(self, **entries):
      self.__dict__.update(entries))

dict = {'key1': 'value1', 'key2': 'value2', 'redundant_key': 'redundant_value'}

ob = MyClass(**dict)