Pythonのクラスを学び、継承を行ってきましたが、ポリモーフィズムという概念も見ていきましょう。
ポリモーフィズムとはオブジェクト指向プログラミングの概念の一つで、日本語では多態性・多様性などと訳されています。
クラスが別であっても同じ名前のメソッドを使用することができ、異なるオブジェクトで同じ操作を切り替えて使うことができるというものです。
こう言ったコードをダックタイピング(duck typing)などと言います。
この言葉は、”If it walks like a duck and quacks like a duck, it must be a duck”(もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである)に由来していて、コードの意味を連想させるものとなっています。
ポリモーフィズムはオブジェクト指向プログラミングの概念ということで、ちょっと初心者としては応用的なものになるとは思いますが、それほど混乱するようなものではないと思いますので、ダックタイピングをやってみましょう。
ダックタイピングのコードを書いてみる
クラスが違っても同じメソッドを利用できるのがダックタイピングですが、クラス定義などのように書き方の決まったフォーマットがあるわけでもないですから、言葉で説明するよりも具体的なコードで動かしてみるのが一番でしょう。
さっそくコードを書いて行きましょう。
一つのクラスを作って呼び出す
まず次のようなコードを用意してみます。
class Duck():
def voice(self):
print("ガーガー")
def walking(self):
print("アヒルがお尻をフリフリ歩きます。")
duck = Duck()
duck.voice()
duck.walking()
ダックタイピングがテーマということでアヒルのクラスを作って見ました。鳴き声と歩くことのメソッドをクラス内に定義しています。
オブジェクト化して、メソッドをそれぞれ呼んでいるところまで書いていますね。
これを実行してみます。(ファイル名はduck_typing.pyにして、Atomで実行しています)
これはクラスを作って、メソッドを呼び出しているだけですよね。
クラスを呼び出す目的の関数を作る
このコードに次のようなクラスの外にメソッドを定義するコードを加えて書いてみます。
def animal_ability(animal):
animal.voice()
animal.walking()
class Duck():
def voice(self):
print("ガーガー")
def walking(self):
print("アヒルがお尻をフリフリ歩きます。")
duck = Duck()
animal_ability(duck)
最初にメソッドを定義した関数を用意しています。このメソッドはDuckクラスを利用して、アヒルが鳴いて、歩くということ想定してここでは書いています。
Duckクラスをオブジェクト化して、このメソッドから実行しているコードが最後に書かれています。
これを実行するとこうなります。
メソッドが実行されて、同じ結果が得られているのがわかります。
別のクラスを用意する – ダックタイピング
そこで、このコードに新たに二つクラスを加えて次のように書き換えてみます。
def animal_ability(animal):
animal.voice()
animal.walking()
class Duck():
def voice(self):
print("ガーガー")
def walking(self):
print("アヒルがお尻をフリフリ歩きます。")
class Elephant():
def voice(self):
print("パオーン")
def walking(self):
print("象がゆったりと歩きます。")
class Horse():
def voice(self):
print("ヒヒーン")
def walking(self):
print("馬がパカパカと歩きます。")
duck = Duck()
animal_ability(duck)
elephant = Elephant()
animal_ability(elephant)
horse = Horse()
animal_ability(horse)
象と馬の二つクラスが追加されているのがわかります。このクラスにはどちらも、アヒルのクラスと同じように、voice()とwalking()のメソッドが定義されています。
これらも合わせて、最後にオブジェクト化して、最初のanimal_ability()関数から呼び出すコードになっています。
これを実行すると、こうなります。
(コードが長くなったので、呼び出し部分をこちらで分けました)
どのクラスもメソッドを利用することができています。
最初、このコードではDuck()クラスを用意しましたが、このクラスを利用する目的でanimal_ability()関数を準備して呼び出しました。
そこに、Elephant()クラスとHorse()クラスを新たに用意しましたが、このクラスの中には、voice()とwalking()のメソッドを用意しています。このメソッドは、直接はDuck()クラスとは関係なく、また、animal_ability()も元々は後の二つのクラスとは関係のない目的で準備しました。
ですが、voice()とwalking()は同じメソッド名として用意されているので、エラーを発生することなく、呼び出すことができているということを示しています。
このように、クラスが異なっていても、同じ名前のメソッドを使用することでオブジェクトを切り替えて使うことができることを、ダックタイピングと言います。
まとめ
Pythonに限らず、プログラミングにはポリモーフィズムという概念があります。これはオブジェクト指向プログラミングの概念の一つで、日本語では多態性・多様性など言われています。
クラスの型が別であっても同じ名前のメソッドがあればそれを使用することができ、異なるオブジェクトで同じ操作を切り替えて使うことができます。
このようなコードをダックタイピング(duck typing)などと言います。