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