Python 多重継承

Python学習【365日チャレンジ!】85日目のマスターU(@Udemy11)です。

Python学習に加えて、ウォーキングも継続できているので、体重増加はなんとか抑えることができていますが、ちょっと気を抜いてお菓子など食べようものなら、すぐに体重が戻ってしまいます。

若い頃なら、ちょっと走ったりしていれば、食べても体重が増えることもなかったのですが、やはり年とともに、基礎代謝が落ちているんでしょうね。

まさに、

I can’t help getting old!

を実感している今日このごろです。

それでは、今日もPython学習をはじめましょう!

昨日の復習

昨日は、Pythonでは基本使わないほうがいい抽象クラスを学習しました。

Pythonには、もともと抽象クラスはなかったのですが、Javaが抽象クラスという概念を持っていたことから、Pythonが新しくなったときに、abcモジュールとして標準ライブラリに実装されるようになったという経緯がありました。

import abc

class Person(metaclass=abc.ABCMeta):
    def __init__(self, name):
        self.name = name

    @abc.abstractmethod
    def sing(self):
        pass

ベースクラスに上記のような記述をすることで、継承クラスがsingメソッドを実装していない場合にインスタンス化することができませんでした。

使う必要がなければ使わないほうがいい手法なので、こんなことができるという認識を持っておけばいいでしょう。

それでは、今日は、抽象クラス同様、使わなくて済むなら使わないほうがいいと言われる多重継承について学習します。

多重継承とは

多重継承は、その名のとおり、多重(2つ以上)の継承をするということで、複数のベースクラスを継承した継承クラスのことです。

タイトルにもあるように、基本的に使わないなら使わないほうがいいのですが、チームでコードを書いたり、プログラムが巨大になってきたときには、すでにあるクラスのメソッドを兼ね備えたクラスが必要になったときには、この多重継承を使わざるを得なくなるときがあるようです。

使わなくてもいいように、最初の設計段階できちっとしたものを作っておくのがベストだということでした。

class Japanese:
    def speak_j(self):
        print('こんにちは')

class American:
    def speak_e(self):
        print('Hello')

class Bilingual(Japanese, American):
    def speak_b(self):
        print('Hello バイリンガルです')

bilingual = Bilingual()
bilingual.speak_j()
bilingual.speak_e()
bilingual.speak_b()

出力結果

こんにちは
Hello
Hello バイリンガルです

日本人が「こんにちは」と話すクラスとアメリカ人が「Hello」と話すクラス、そして、バイリンガルが両方のメソッドを継承したクラスを作りました。

記述方法は、これまでベースクラス名を記述していたのと同様に、,(カンマ)を入れて2つ目のクラスを追加するだけです。

JapaneseAmericanのクラスを継承したBilingualクラスを作って、Bilingualクラスだけが持つメソッド(speak_b)を追加しています。

最初にプログラムを書いたときには、バイリンガルクラスを作る気はなかったのですが、「そういえば、日本語も英語も話せるクラスがあったらいいよね」ってなったときなどに、多重継承を使うイメージですね。

同じメソッドを持っていた場合

もし、日本人が英語話すメソッド(speak_e)を持っていた場合、どうなるかというと、継承の記述の順番が関係してきます。

class Japanese:
    def speak_j(self):
        print('こんにちは')

    def speak_e(self): 
        print('ハロー')

class American:
    def speak_e(self):
        print('Hello')

class Bilingual(Japanese, American): #この記述順が関係する
    def speak_b(self):
        print('Hello バイリンガルです')

bilingual = Bilingual()
bilingual.speak_e()

出力結果

ハロー

5行目と9行目で同じspeak_eメソッドが定義されていますが、12行目のクラスを継承する際に、記述する順番で、どちらのメソッドが利用されるかがきまります。

この場合、左に記述されているJapaneseが先に読み込まれて、Japaneseで定義されているspeak_eが使われるため、出力結果がハローになっています。

なので、12行目をclass Bilingual(American, Japanese):に変更すると、出力結果は、Helloに変わります。

必要ないものが多い?

昨日、今日とあまり使わないほうがいい方法を学びましたが、酒井さんの講座で紹介されているということは、使っている人がいて今後コードを書いていく中では目にする機会があるから紹介してくれているんだと思います。

だって、Pythonに関する全ての内容をカバーしようと思えば、時間がいくらあっても足りないですし、ほぼ使うことのない標準ライブラリなどもあるはずです。

そんな莫大な情報の中からピックアップしてレクチャーに入っているということは、覚えておいたほうがいいということだと考えて、あまり使われないしても見かけたときは、「あ〜、あのことね」とわかるように、頭の片隅に残しておきたいと思います。

私がPythonを学習している酒井さんの講座はこちら!

Udemy講師 酒井さん プログラミング Python

今日の内容は、少し箸休め的な内容になりましたが、明日からも気を抜くことなく、Python学習を継続していきますよ〜!

それでは、明日もGood Python!