如何确定类实例的类型

时间:2012-03-03 18:58:30

标签: python python-3.x

要确定课程,我可以这样做:

class A: pass    
a = A

type(A) is type #True

或:

import inspect
inspect.isclass(A) 

但是如何确定类实例的类型,不知道类名?

这样的事情:

isinstance(a, a.__class__.__name__)
#TypeError: isinstance() arg 2 must be a type or tuple of types

我找到了一个解决方案,但它不适用于Python 3x

import types

class A: pass
a = A()

print(type(a) == types.InstanceType)
#AttributeError: 'module' object has no attribute 'InstanceType'

解决方案:

if '__dict__' in dir(a) and type(a) is not type:

3 个答案:

答案 0 :(得分:17)

你的问题有点不清楚。您想确定“类实例的类型”。这可能意味着两件事。您要么确定实例是特定类的实例。你可以这样做:

>>> isinstance(a, A)
True

您也可以通过type()调用获取课程,但这通常不是很有用:

>>> type(a)
<class '__main__.A'>

但是你展示的测试不会检查这个。相反,他们会检查的类型。但是Python 3只有一种类型。 Python 2以及“旧式”和“新式”类,但Python 3只有新式类,所以不需要在Python 3中进行这种检查。

您也可以使用元类。在这种情况下,您可以通过检查类的__class__

来找到元类
>>> from abc import ABCMeta
>>> class B(metaclass=ABCMeta): pass
>>> type(B)
<class 'abc.ABCMeta'>

但是,从您的评论中,您似乎想要确定对象是否是实例。如果你这样做,你会得到更好的答案......

无论如何,为此,您使用inspect.isclass

>>> import inspect
>>> inspect.isclass(a)
False
>>> inspect.isclass(A)
True

这是因为一切都是一个实例:

>>> isinstance(type, type)
True

但并非一切都是一个阶级。

答案 1 :(得分:14)

type(a)是实例的类型,即它的类。 a.__class__也是对实例类的引用,但您应该使用type(a)

types.InstanceType仅适用于Python 3.0之前版本的旧式类,其中所有实例都具有相同的类型。您应该在2.x中使用新式类(派生自object)。在Python 3.0中,所有类都是新式类。

答案 2 :(得分:1)

这是因为旧式类实例都是InstanceType,在Python 3.x中只有新式类,它们与类型相同。所以a将在Python 3.x中输入A.然后就不需要包含InstanceType,因此它不再存在。