継承クラス検索

渡されたインスタンスがあるクラスを継承しているかチェックしたかったんで書いてみた。組み込みで既に存在しているんじゃないかと思ってるんだけど…。

import types

def probeclass(names, o):
    """
    @description: 指定したクラスもしくはインスタンスがあるクラスに
                  属しているか検索する

    @param names: リストもしくはタプルでマッチするクラス名を列挙する
    @param o:     検索対象のクラスもしくはインスタンスを指定する
    @return:      クラスに属していた場合は属していたクラスに対応する
                  names のインデックス値が、属していなかった場合には
                  0 未満の値が返却される
    """

     def sub(names, o):
         for i, n in zip(range(len(names)), names):
             if o.__name__ == n:
                 return i
         else:
             if o.__bases__:
                 for c in o.__bases__:
                     r = sub(names, c)
                     if r >= 0:
                         return r
         return -1

     if names:
         if isinstance(o, types.InstanceType):
            return sub(names, o.__class__)
         elif isinstance(o, types.ClassType):
            return sub(names, o)
     return -1

# 実験
class A: pass
class B: pass
class C(B): pass
class D: pass
class E(A, B): pass

def test():
    probeclass(('A', ), A)
    probeclass(('B', 'D'), A)
    probeclass(('B', 'D'), B)
    probeclass(('B', 'D'), C)
    probeclass(('B', 'D'), D)
    probeclass(('B', 'D'), E)

# test() の実行結果
0
-1
0
0
1
0