【Python3.x】Exception::__subclasshook__()メソッドの使い方
__subclasshook__メソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
__subclasshook__メソッドは、あるクラスが特定のクラス(この場合はException)のサブクラスであるかどうかを、Pythonの標準的な継承関係とは独立した形で判定する機会を提供するメソッドです。このメソッドは主に抽象基底クラス (Abstract Base Class; ABC) の仕組みと連携して利用され、明示的に継承していなくても、特定の規約や条件を満たすクラスをそのABCの「仮想的なサブクラス」として認識させるために実装されます。
しかし、PythonのExceptionクラスは抽象基底クラスではありません。そのため、Exceptionクラスが直接この__subclasshook__に独自のサブクラス判定ロジックを実装していることは通常ありません。したがって、issubclass()関数などでExceptionのサブクラス判定が求められた際にこのメソッドが呼び出されても、ほとんどの場合、特別な判定は行われずにNotImplementedが返されます。これにより、Pythonは通常のクラス継承階層に基づくサブクラス判定ロジックに委ねられます。
このことから、Exceptionクラスにおける__subclasshook__は、特別な仮想サブクラス判定の機能を持つものではなく、Pythonのオブジェクトモデルに共通して存在するメソッドとして理解するのが適切です。
構文(syntax)
1class Exception: 2 @classmethod 3 def __subclasshook__(cls, C): 4 pass
引数(parameters)
cls: type, C: type
- cls: type: このメソッドが呼び出されているクラス自身です。
- C: type: 検査対象のクラスです。
戻り値(return)
bool | NotImplementedType
このメソッドは、サブクラスのチェックが成功した場合は True を、そうでなくサブクラスチェックの判断を他のメカニズムに委ねる場合は NotImplemented を返します。