

# 環境

  * Python 3.11.2

# 質問

抽象メソッドを定義していないクラスで、`abc.ABC`を継承する必要性はありますか？

たとえば以下のコードでは、`Cat`と`Dog`クラスの親クラスである`Animal`クラスには、抽象メソッドは存在しません。しかし`Animal`クラスはインスタンス化を想定しておらず、また`Animal`クラスは`Cat`と`Dog`の抽象的（本当？）なクラスだと考え、`abc.ABC`を継承しました。

[code]

    from dataclasses import dataclass
    from typing import ClassVar
    import abc
    
    class Animal(abc.ABC):
        animal_name: ClassVar[str]
    
    
    @dataclass
    class Cat(Animal):
        animal_id: str
        animal_name: ClassVar[str] = "cat"
    
        def only_cat_method(self):
            print("only cat method")
    
    
    @dataclass
    class Dog(Animal):
        animal_id: str
        animal_name: ClassVar[str] = "dog"
    
        def only_dog_method(self):
            print("only dog method")
    
    
[/code]

抽象メソッドが存在しない状態で、`abc.ABC`を継承しても継承しなくても、動作は変わらないように見えました。検証内容は、[ブログ](https://qiita.com/yuji38kwmt/items/5ae8b07b3c2bdcd71cb0)にまとめました。

上記のコードでは、`Animal`クラスは`abc.ABC`を継承して抽象基底クラスにした方がよいのでしょうか？それとも抽象メソッドが定義されるまでは、`abc.ABC`を継承しない方がよいのでしょうか？

公式ドキュメントの[abc.ABC](https://docs.python.org/ja/3/library/abc.html#abc.ABC)を読みましたが、継承するとどうなるのかよく分からなかったので、質問しました。

# 補足

抽象クラスの定義は、[IT用語辞典
e-Words](https://e-words.jp/w/%E6%8A%BD%E8%B1%A1%E3%82%AF%E3%83%A9%E3%82%B9.html)
には以下のように記載されていました。

> 抽象メソッド（abstract
> method）は名前や引数、返り値の型といった宣言部分のみが記述されたメソッド定義で、処理の本体（実装コード）が存在しない。クラスを継承したサブクラス（子クラス/派生クラス）が共通して必ず実装すべきのメソッドを指示するために用いられる。

この定義に従うならば、`abc.ABC`は継承すべきでなさそうです。


CC BY-SA 4.0
2023-05-03T08:40:58.477
94726
2023-05-03T15:08:15.710
2023-05-03T15:08:15.710
3060
19524
question
python
Pythonで抽象メソッドが存在しないクラスで、`abc.ABC`を継承する必要性はありますか？