Pythonの学習中に issubclass() と isinstance() という関数が出てきて、 それぞれの使い方や違いを整理しておきたかったのでメモとしてまとめました。
どちらも「あるクラスやオブジェクトが、他のクラスとどういう関係か」を判別するときに使う関数です。
issubclass()関数:クラス同士の親子関係を調べる
issubclass() は、あるクラスが 指定したクラスのサブクラス(子クラス)かどうか を判定する関数です。
書き方
issubclass(子クラス, 親クラス)
例
class Animal:
pass
class Dog(Animal):
pass
print(issubclass(Dog, Animal)) # True
print(issubclass(Animal, Dog)) # False
Dog は Animal を継承しているので、issubclass(Dog, Animal) は True になります。
逆に、Animal は Dog の親なので、issubclass(Animal, Dog) は False になります。
isinstance()関数:オブジェクトの型を調べる
isinstance() は、あるオブジェクトが 指定したクラスのインスタンスかどうか を判定する関数です。
書き方
isinstance(オブジェクト, クラス)
例
dog = Dog()
print(isinstance(dog, Dog)) # True
print(isinstance(dog, Animal)) # True(親クラスでもTrueになる)
print(isinstance(dog, str)) # False
dog は Dog クラスから作ったオブジェクトなので、Dog でも Animal(親クラス)でも True になります。
文字列型(str)とは関係ないので isinstance(dog, str) は False です。
使い分けのまとめ
| 関数名 | 判定対象 | 何を調べるか |
|---|---|---|
issubclass() |
クラスとクラス | サブクラス(継承関係)かどうか |
isinstance() |
オブジェクトとクラス | インスタンス(型)かどうか |
補足:Pythonでは「型=クラス」「値=インスタンス」
Pythonでは、「型」と言ったときには int や str のようなクラスのことを指していて、実際の値(データ)はそのクラスから作られた「インスタンス」になっています。
print(type("hello")) # <class 'str'>
print(isinstance("hello", str)) # True
このように isinstance() は型判定としてよく使われています。
また、issubclass() はクラス設計の場面などで継承関係を確認するのに使われるみたいです。
おわりに
最初は名前が似ていてよくわからなかったのですが、書いてみると役割の違いがはっきりしてきました。
今後もクラスを使う場面で登場しそうなので、引き続き使いながら慣れていきたいと思います。