为什么vars(type('',(object,),input_dict)())不返回其变量?

时间:2019-12-27 15:05:49

标签: python-3.x class object

要将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'}

如果您能解释一下为什么前者不返回其属性,我将不胜感激。

1 个答案:

答案 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类的所有对象之间共享。