2012-03-03 72 views
10

的类型来决定的课,我可以这样做:如何确定类实例

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 3倍的工作

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: 
+0

你问如何确定一个对象是一个类还是一个类的实例? – grifaton 2012-03-03 19:06:33

+0

InstanceType是旧样式的类,它在3.x中不存在。 – 2012-03-03 19:07:45

+0

@grifaton,我想区分类和实例 – Opsa 2012-03-03 19:12:24

回答

11

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

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

+1

类型(a)仅适用于新式课程!如果您使用的是旧式课程 - 请参阅是否可以将它们更改为新式。否则,使用一个.__ class__,它也适用于旧式。 @ kindall的回答已经暗示了这一点,但我认为我会为人们解决这个问题。 – 2016-06-14 13:11:41

1

这是因为该旧式类实例都是InstanceType,在Python 3.x中只有n个ew风格的类,与类型相同。所以a将是Python 3.x中的类型A.那么不需要包含InstanceType,所以它不再存在。

13

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

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

但并非一切都是一类。