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
class 的 type
是什么。请记住,classes 也是 Python 中的 实例 。当您在脚本中执行 class Child...
时,会在脚本的命名空间中添加一个新名称 (Child
)(几乎是一个名为 Child
且类型为 AMeta
的变量,因为您重新指定 AMeta
是 Child
的 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'>
我正在尝试将 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
class 的 type
是什么。请记住,classes 也是 Python 中的 实例 。当您在脚本中执行 class Child...
时,会在脚本的命名空间中添加一个新名称 (Child
)(几乎是一个名为 Child
且类型为 AMeta
的变量,因为您重新指定 AMeta
是 Child
的 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'>