我正在尝试将类的类型传递给方法,以便可以动态实例化它。该类扩展到基类,基类进一步扩展到抽象类。现在,当我检查我的类类型时,它是抽象类类型而不是子类。
这是我的课程的样子
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)
,你是在问你的Child
类的type
是什么。请记住,类也是 Python 中的实例。当你在脚本中执行class Child...
时,有一个新名称(Child
(添加到脚本的命名空间中(几乎是一个称为AMeta
类型的Child
变量,因为您指定AMeta
是Child
的元类。否则,它将属于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'>