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



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

这是我的课程的样子

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 方法实现我所实现的目标?

类是其元类的实例。 因此:

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

如果你做type(Child),你是在问你的Childtype是什么。请记住,类也是 Python 中的实例。当你在脚本中执行class Child...时,有一个新名称(Child(添加到脚本的命名空间中(几乎是一个称为AMeta类型的Child变量,因为您指定AMetaChild的元类。否则,它将属于type类型,有点像"默认"元类(

看:

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)即可获得课程。您可以直接使用它。例如:

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'>

相关内容

  • 没有找到相关文章

最新更新