如何确定类实例的类型

Ops*_*psa 15 python python-3.x

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

class A: pass    
a = A

type(A) is type #True
Run Code Online (Sandbox Code Playgroud)

要么:

import inspect
inspect.isclass(A) 
Run Code Online (Sandbox Code Playgroud)

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

像这样的东西:

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

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

import types

class A: pass
a = A()

print(type(a) == types.InstanceType)
#AttributeError: 'module' object has no attribute 'InstanceType'
Run Code Online (Sandbox Code Playgroud)

解:

if '__dict__' in dir(a) and type(a) is not type:
Run Code Online (Sandbox Code Playgroud)

Len*_*bro 20

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

>>> isinstance(a, A)
True
Run Code Online (Sandbox Code Playgroud)

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

>>> type(a)
<class '__main__.A'>
Run Code Online (Sandbox Code Playgroud)

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

您也可以使用元类.在这种情况下,您可以通过检查类的类来找到元类__class__:

>>> from abc import ABCMeta
>>> class B(metaclass=ABCMeta): pass
>>> type(B)
<class 'abc.ABCMeta'>
Run Code Online (Sandbox Code Playgroud)

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

无论如何,要做到这一点,你使用inspect.isclass:

>>> import inspect
>>> inspect.isclass(a)
False
>>> inspect.isclass(A)
True
Run Code Online (Sandbox Code Playgroud)

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

>>> isinstance(type, type)
True
Run Code Online (Sandbox Code Playgroud)

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


kin*_*all 16

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

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