要将dict转换为类,我编写了如下代码,并且效果很好。
output_class = type('', (object,), input_dict)()
但是,创建的类不会通过下面的代码返回其属性!
print(vars(output_class))
>> {}
我使用下面的代码解决了这个问题,但我仍然感到困惑。
class Struct(object):
def __init__(self, **entries):
self.__dict__.update(entries)
output_class = Struct(**input_dict)
print(vars(output_class))
>> {'key': 'value'}
如果您能解释一下为什么前者不返回其属性,我将不胜感激。
答案 0 :(得分:0)
这是因为在您的类的第一种情况(调用类型)中,对象具有空的__dict__
并且您的input_dict内容存储在类变量中。
type()
的第三个参数定义类(而非对象)变量或方法(它们由__new__
调用而不是__init__
定义)。
简单地说,第一和第二代码段不相同。
所以
output_class = type('', (object,), input_dict)()
,
具有类似这样的内容:
class Struct(object):
def __new__(cls, **entries):
cls = super().__new__()
for k,v in **entries:
setattr(cls, k, v)
return obj
output_class = Struct()
如果您想要类似的东西:
class Struct(object):
def __init__(self, **entries):
self.__dict__.update(entries)
output_class = Struct(**input_dict)
您应该定义 init ()。它看起来像:
output_class = type('', (object,),
{'__init__': lambda self, inp_d: self.__dict__.update(inp_d)})(input_dict)
如果我的解释不够清楚,我想这里的例子可以帮助您:https://docs.python.org/3/library/functions.html#type
请注意:a不在__init__()
方法内部,因此它在X类的所有对象之间共享。