【Python】AbstractBaseClass(ABC, 抽象規程クラス)かどうかの判定

【Python】AbstractBaseClass(ABC, 抽象規程クラス)かどうかの判定


# python

やりたかったこと

ゆるふわにpytestでテストをしようとしたかったのですが、その過程である__init__.pyに書かれているメソッドを全てテストする。ということをしようとしました。

が、そこで問題となったのがabstractクラスも__init__.pyに含まれていて、こいつをいい感じに省いてやらなければいけなかったのです。

AbstractBaseClassの判定方法

inspect.isabstractを使いましょう。That’s ALL。

まずは適当なクラスを定義してあげます。

from abc import ABCMeta, abstractclassmethod
class A(metaclass=ABCMeta):
    @abstractclassmethod
    def ab():
        pass

class B(A):
    def ab():
        pass
    
class C:
    pass

本題の判定(+失敗した例です。)

import inspect

for c in [A,B,C]:
    print('-----')
    try:
        print(c.__name__)
        print(f'type={type(c)}')
        print(f'isabstract={inspect.isabstract(c)}')
        print(f'type(instance)={type(c())}')
    except TypeError as e:
        print(e)


# -----
# A
# type=<class 'abc.ABCMeta'>
# isabstract=True
# Can't instantiate abstract class A with abstract methods ab
# -----
# B
# type=<class 'abc.ABCMeta'>
# isabstract=False
# type(instance)=<class '__main__.B'>
# -----
# C
# type=<class 'type'>
# isabstract=False
# type(instance)=<class '__main__.C'>
#

参考

stack overflowさんはやはり偉大でしたが、中々見つからなかったので未来の自分のために残しておきます。

https://stackoverflow.com/questions/14410860/determine-if-a-python-class-is-an-abstract-base-class-or-concrete

 

なお、きちんと公式ドキュメントにもinspect.isabstractの記載がありますが、英語だし見つけにくい…。 まあ中々使わないメソッドですしね、仕方ない。