Pythonでは、あるオブジェクトが特定のクラスのインスタンスであるかどうかを確認するためにisinstance
関数を使用します。しかし、この関数はオブジェクトが指定したクラスのサブクラスのインスタンスである場合もTrueを返します。したがって、オブジェクトが特定のクラスのインスタンスであるがサブクラスではないことを確認するには、以下のような関数を定義することができます。
def instance_but_not_subclass(obj, klass):
return obj.__class__ is klass
この関数では、オブジェクトの__class__
属性(オブジェクトの正確なクラスへの参照)を引数として与えられたクラスと比較しています。この方法で、オブジェクトが特定のクラスのインスタンスであるがそのサブクラスではないことを確認することができます。
なお、Pythonではclass
は予約語であるため、変数名として使用することはできません。そのため、上記の関数ではklass
という名前を使用しています。
このようなテクニックは、オブジェクト指向プログラミングにおいて、特定のクラスの正確なインスタンスを必要とする場合などに有用です。Pythonのクラスメカニズムは、オブジェクト指向プログラミングの標準的な機能を全て提供しており、このような細かな制御も可能です。