オブジェクト指向 上級

63. インターフェース的な考え方とダックタイピング

Pythonに「interface」というキーワードはない

他のプログラミング言語(JavaやC#など)を学んだことがある人は、「interface」という専用のキーワードを見たことがあるかもしれません。実はPythonにはそのものズバリのキーワードはありません。その代わりPythonでは、前のレッスンで習った抽象クラス(abc)を使う方法と、これから紹介する「ダックタイピング」という、もっと緩やかな考え方の、主に2通りでインターフェースに近い設計を実現します。

ダックタイピングという発想

ダックタイピングとは「アヒルのように歩き、アヒルのように鳴くなら、それはアヒルとして扱ってしまおう」という考え方です。つまりPythonでは、あるオブジェクトが特定のクラスを継承しているかどうかよりも、「必要なメソッドを持っているかどうか」の方が重視されます。まったく無関係な2つのクラスでも、同じ名前のメソッドさえ持っていれば、呼び出す側のコードを共通化できてしまうのです。これはPythonらしい、とても柔軟な設計思想の1つです。

サンプルコード

class Cat:
    def speak(self):
        print('ニャー')

class Duck:
    def speak(self):
        print('ガーガー')

def make_it_speak(animal):
    animal.speak()

make_it_speak(Cat())
make_it_speak(Duck())
CatとDuckは継承関係がまったくない、独立したクラスです。それでもどちらもspeak()というメソッドを持っているため、make_it_speak()という同じ関数にどちらを渡しても、animal.speak()が正しく動作します。「型が何であるか」より「必要な動作を持っているか」を重視するのが、ダックタイピングの考え方です。

📝 練習問題

練習問題:speak()メソッドを持つRobotクラスを新しく作り、make_it_speak()にRobotのインスタンスを渡して動作を確認してください。