确定 python 中的一个(非内置)class 的类型

Determine the type of a (not built in) class in python

我有一个代表镶嵌的网格,它是 Polygon class(我制作的 class)的一组实例。我还有一个 Boundary class,它是 class 代表模拟的边界,我是 运行(我做的另一个 class)。任何五边形的任何一行都可以有两个 Polygon 对象或一个 Polygon 和一个 Boundary 对象作为 "parents" (我为行定义的属性 class).对象的类型决定了我如何进行某些计算。

所以,简而言之,我需要一种方法来判断一个特定变量是两个 classes 中的哪一个的实例,我在其中创建了两个 classes。当我调用 type(parent) 时,我得到:

 <type 'instance'>

我该如何确定?

在 Python 中执行类型检查的惯用方法是使用 isinstance:

if isinstance(x, Boundary):
    # x is of type Boundary
elif isinstance(x, Polygon):
    # x is of type Polygon

演示:

>>> class Boundary:
...     pass
...
>>> x = Boundary()
>>> isinstance(x, Boundary)
True
>>>

请注意,type(x) is Boundary 也可以,但它不会像 isinstance 那样考虑继承。

在旧式 classes 中,您使用 __class__ 属性检查实例的 class,在新式 classes type() 中将正常工作(阅读:NewClass Vs Classic Class). In old-style classes every instance of user-defined class was of type instance(Unifying types and classes in Python 2.2)。

>>> a = A()
>>> class A:
    pass
... 
>>> a = A()
>>> a.__class__
<class __main__.A at 0x7fcce57b1598>
>>> a.__class__ is A
True

在新式 classes type(ins) 和 ins.__class__ 中现在做同样的事情:

>>> class B(object): # Inherit from object to create new-style class
    pass
... 
>>> b = B()
>>> type(b)
<class '__main__.B'>
>>> b.__class__
<class '__main__.B'>

您还可以使用 isinstance() 检查对象是否是 class:

的实例
>>> isinstance(a, A)
True
>>> isinstance(b, B)
True

但是使用 isinstance 检查这个并不意味着 class 是实例的确切父级:

>>> class C(B):
    pass
... 
>>> c = C()
>>> isinstance(c, B)
True

尝试测试对象的 __class__ 属性:

class Class(object):
    def __init__(self):
        pass # Object created

obj = Class()
print obj.__class__ == Class