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)