Python type() 没有给出确切的 class 类型,而是给出了 metaclass 类型

Python type() not giving exact class type instead gives metaclass type

我正在尝试将 class 的类型传递给一个方法,以便它可以被动态实例化。 class 扩展到基础 class,基础 class 进一步扩展到抽象 class。现在,当我检查 class 的类型时,它作为抽象 class 类型出现,而不是子 class.

这是我的 class 的样子

class AMeta(type):
     # stuff

class Parent(six.with_metaclass(AMeta, object)):
     # stuff

class Child(Parent):
    # stuff

现在,当我使用 type(Child) or Child.__class__ 时,它会给我 AMeta,而我想得到 Child。我想将此 Child 传递给另一个将动态创建其对象的方法。

def create_obj(clzz):
   return clzz()

当我调用 create_obj(type(Child)) 之类的方法时,它不起作用并且中断了,但是当我调用 Child.mro()[0] 时,它工作正常,这里发生了什么,还有另一种方法可以实现我正在实现的目标通过 mro 方法?

一个class是它的metaclass的一个实例。因此:

  • Child的类型是AMeta
  • Child()的类型是Child

如果你这样做 type(Child),你是在问你的 Child classtype 是什么。请记住,classes 也是 Python 中的 实例 。当您在脚本中执行 class Child... 时,会在脚本的命名空间中添加一个新名称 (Child)(几乎是一个名为 Child 且类型为 AMeta 的变量,因为您重新指定 AMetaChild 的 metaclass。否则,它将是 type 类型,有点像 "default" meta[=58] =])

参见:

import six

class AMeta(type):
     pass

class Parent(six.with_metaclass(AMeta, object)):
     pass

class Child(Parent):
    pass

print(type(Child))
c=Child()
print(type(c))

在第一次打印中,您得到 <class '__main__.AMeta'> 因为您在询问 我的 Child 实例 的类型是什么? 。在第二个打印中你得到 <class '__main__.Child'> 因为你问 我的 c 实例 的类型是什么?

您无需 type(Child) 即可获得 class。你可以直接使用它。例如:

obj = Child
dynamic_instance = obj()
print(type(dynamic_instance))

将打印 <class '__main__.Child'>

更接近你的例子,那就是:

def create_obj(clzz):
   return clzz()

a = create_obj(Child)
print("Just created: %s" % type(a))

输出Just created: <class '__main__.Child'>