コード書いてる時に予測変換で「abc」が出て、知らなかったので調べた。
開発環境
> python -V
Python 3.10.0rc2
abc (抽象基底クラス) とは
abc は abstract base class の頭文字で、抽象基底クラスを表す。
インスタンスとしてではなく、そのもの自体を継承させることを前提としたクラス。
Swift の Protocol のようなイメージ。
abc を直接インスタンス化
不可能。継承させることを前提としたクラスなので、abc 自体をインスタンス化できない。
import abc
class Bird(metaclass=abc.ABCMeta):
@abc.abstractclassmethod
def fly(self):
pass
def main():
bird = Bird()
if __name__ == "__main__":
main()
> python main.py
Traceback (most recent call last):
File "/py/src/main.py", line 16, in <module>
main()
File "/py/src/main.py", line 12, in main
bird = Bird()
TypeError: Can't instantiate abstract class Bird with abstract method fly
abc を継承したクラスを作成
import abc
class Bird(metaclass=abc.ABCMeta):
@abc.abstractclassmethod
def fly(self):
print("fly")
class Sparrow(Bird):
def fly(self):
return super().fly()
def main():
bird = Sparrow()
bird.fly() # "fly"
if __name__ == "__main__":
main()
abc 判定
import inspect
def main():
print(inspect.isabstract(Bird)) # True
サブクラス判定
def main():
sparrow = Sparrow()
parrot = Parrot()
print(issubclass(Sparrow, Bird)) # True
abc はクラスなので、クラスとしての判定も機能する。