Python Tips: あるオブジェクトが特定のクラスのインスタンスかチェックしたい

Pythonで、あるオブジェクトが特定のクラスのインスタンスかどうかをチェックする方法をご紹介します。

大きく分けて2つの方法があります。 type isinstance

type

type 関数は、引数に渡されたオブジェクトのクラスを返す関数です。ですので、 type の戻り値とクラスの is 比較を行うことによってクラス・インスタンスの関係をチェックすることができます。

s = "hello"
print type(s) == str  # => True
# s は str のインスタンスなので True

i = 10
print type(i) == int  # => True
# i は int のインスタンスなので True

f = 7.77
print type(f) == float  # => True
# f は float のインスタンスなので True

もちろん、自作クラスの場合も組み込みの型と同じ形でチェックが可能です。

class MyClass(object):
    pass

m1 = MyClass()

print type(m1) == MyClass  # => True

isinstance

isinstance 関数は、引数をふたつ受け取り、ひとつめにオブジェクト、ふたつめにクラスを受け取ります。ひとつめに渡したオブジェクトがふたつめのクラスのインスタンスである場合は True を返します。

print isinstance("hello", str)  # => True

print isinstance([], list)  # => True

print isinstance({}, dict)  # => True

isinstance が type と異なるのは、クラスが継承元の場合にも True を返す点です。

class Parent(object):
    pass

class Child(Parent):
    pass

c1 = Child()
print isinstance(c1, Parent)  # => True
# 継承元のクラスでも True となる

print isinstance(c1, object)  # => True
# object も同様

また、 isinstance のふたつめの引数をタプルにすることによって、複数のクラスに対して一度にクラス・インスタンス関係を調べることなんかも可能です。

class A(object):
    pass

class B(object):
    pass

b1 = B()
print isinstance(b1, (A, B))  # => True
# b1 は A には属さないがBには属するので True

参考