このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】オブジェクトやクラスを調べる関数

オブジェクトやクラスを調べる関数

 オブジェクトやクラスを調べる関数は、プログラムのデバッグや実行時の型チェック、さらにはクラス継承の関係を確認するために非常に重要です。これらの関数を使えば、オブジェクトの一意な識別子やハッシュ値、型やクラスの関係を簡単に把握することができます。ここでは、代表的な関数である id、hash、super、type、isinstance、issubclass について、基本の使い方と応用例を解説します。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.オブジェクトの識別とハッシュ値

1.1. id関数

 id関数は、オブジェクトの一意な識別子(通常、CPythonではメモリアドレス)を返します。これにより、異なるオブジェクトかどうかを判断できます。

【構文】

id(オブジェクト)
関数読み方説明
id()アイディーオブジェクトの一意な識別子を返す

【例】

a = 42
b = "example"
print("ID of a:", id(a))
print("ID of b:", id(b))

実行結果

ID of a: 140716960263896
ID of b: 1357750844848

解説

 変数aやbに格納されたオブジェクトの識別子が整数として返され、オブジェクトが異なれば異なるIDとなります。

1.2. hash関数

 hash関数は、オブジェクトのハッシュ値(辞書のキーとして使用できるような整数)を返します。ただし、ミュータブルなオブジェクトはハッシュ不可能です。

【構文】

hash(オブジェクト)
関数読み方説明
hash()ハッシュオブジェクトのハッシュ値を返す(キーとして利用可能)

【例】

num = 42
text = "sample"
print("Hash of 42:", hash(num))
print("Hash of 'sample':", hash(text))

実行結果

Hash of 42: 42
Hash of 'sample': -3614959064721237968

【解説】

 数値や文字列はイミュータブルなため、ハッシュ値が定まっており、集合や辞書のキーとして使用できます。

1.3. super関数

 super関数は、クラスの継承関係において、基底クラスのメソッドを呼び出すために使います。特に、派生クラスでメソッドをオーバーライドした場合に、基底クラスの実装を補完するのに便利です。

【構文】

super().メソッド名(引数, …)

【例】

 以下の例では、Vehicleクラスを基底クラスとして、Carクラスでメソッドをオーバーライドし、super関数で基底クラスのメソッドを呼び出しています。

class Vehicle:
    def start(self):
        print("Vehicle is starting.")

class Car(Vehicle):
    def start(self):
        print("Car is starting.")
        super().start()

my_car = Car()
my_car.start()

実行結果

Car is starting.
Vehicle is starting.

解説

 Carクラスのstartメソッドは、自身の処理を実行した後、super().start() により Vehicleクラスのstartメソッドを呼び出します。

2.型や継承関係を調べる関数

2.1. type関数

 type関数は、オブジェクトの型(クラス)を返します。これにより、オブジェクトがどのクラスに属しているかを確認できます。

【構文】

type(オブジェクト)
説明
type(123)<class 'int'>(整数型)
type("python")<class 'str'>(文字列型)
type([1, 2, 3])<class 'list'>(リスト型)

【例】

print("Type of 123:", type(123))
print("Type of 'python':", type("python"))
print("Type of [1,2,3]:", type([1,2,3]))

実行結果

Type of 123: <class 'int'>
Type of 'python': <class 'str'>
Type of [1,2,3]: <class 'list'>

解説

 それぞれのオブジェクトに対して、その型が返され、型情報を利用して適切な処理を行う際の参考になります。

2.2. isinstance関数

 isinstance関数は、オブジェクトが指定したクラスのインスタンスであるか(またはその派生クラスのインスタンスであるか)を判定します。

【構文】

isinstance(オブジェクト, クラス)
説明
isinstance(123, int)123はintのインスタンス → True
isinstance("python", str)'python'はstrのインスタンス → True
isinstance([1,2,3], list)[1,2,3]はlistのインスタンス → True

【例】

print("123 is an int:", isinstance(123, int))
print("'python' is a str:", isinstance("python", str))
print("[1,2,3] is a list:", isinstance([1,2,3], list))

実行結果

123 is an int: True
'python' is a str: True
[1,2,3] is a list: True

解説

 isinstance関数は、オブジェクトの型チェックを行い、継承関係にも対応しているため、派生クラスも含めたチェックが可能です。

2.3. issubclass関数

 issubclass関数は、あるクラスが別のクラスの派生クラス(サブクラス)であるかどうかを判定します。クラスが同一の場合にもTrueが返されます。

【構文】

issubclass(クラスA, クラスB)
説明
issubclass(Derived, Base)DerivedがBaseの派生クラスならTrue、同一の場合もTrue
issubclass(Derived, Other)DerivedがOtherの派生クラスでなければFalse

【例】
以下は、クラスXを基底クラスとして、クラスYとクラスZを派生させた例です。

class X:
    pass

class Y(X):
    pass

class Z(X):
    pass

print("Z is subclass of X:", issubclass(Z, X))  # True
print("Z is subclass of Y:", issubclass(Z, Y))  # False

実行結果

Z is subclass of X: True
Z is subclass of Y: False

解説

  • クラスZはクラスXから派生しているため、issubclass(Z, X)はTrueとなります。
  • 一方、クラスZはクラスYからは派生していないので、issubclass(Z, Y)はFalseになります。

まとめ

Pythonには、オブジェクトやクラスを調べるための便利な関数が多数存在します。

  • id関数は、オブジェクトの一意な識別子を返し、hash関数はオブジェクトのハッシュ値を返します。
  • super関数を使うと、派生クラスから基底クラスのメソッドを呼び出すことが可能です。
  • type関数はオブジェクトの型を返し、isinstance関数とissubclass関数は、オブジェクトのインスタンスやクラスの派生関係を判定します。

 これらの関数を活用することで、オブジェクトやクラスの状態、継承関係を正確に把握でき、プログラムのデバッグや設計、さらには動的な型チェックが効率的に行えるようになります。