Python クラスの継承

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

以前、U-NEXTを使っていたときがあったのですが、昨日紹介したAmazonプライムビデオと同じように、ある程度見放題の映画も揃っています。

あと、U-NEXTの強み!?としては、動画配信サービスの中で唯一と言えるセクシー系の映像も扱っているんですよね。

そちらメインで利用している人も多いかもしれませんが、メッキの刃やヒロアカ、ハイキューなどの人気アニメが見放題になっているのも魅力の一つで、31日間の無料体験期間があるうえ、新規登録で600円分のポイントがもらえるので、有料の最新映画も見ることが可能です。

とりあえず動画サービスを試してみたい方にはおすすめです。

(※本ページの情報は2020年4月時点のものです。最新の配信状況は U-NEXT サイトにてご確認ください。)

U-NEXT

ということで、今日もPython学習をはじめていきましょう!

昨日の復習

昨日は、コンストラクタとデストラクタについて学習しました。

どちらのクラスの定義の中にdef文で記載しますが、インスタンスが作られたときに最初に実行されるのがコンスタラクタで、インスタンスを削除するときに実行されるのがデストラクタです。

デストラクタは、クラス外に直接delで呼び出してインスタンスを削除することもできましたね。

class Animal(object):
    def __init__(self, name):
        self.animal_types = name

    def say(self):
        print('This is a {}'.format(self.animal_types))

    def __del__(self):
        print('Good Bye')

dog = Animal('dog')
cat = Animal('cat')

dog.say()

del dog

cat.say()

出力結果

This is a dog
Good Bye
This is a cat
Good Bye

Animalクラスからdogcatのインスタンスをつくり、sayメソッドを実行しています。

16行目のdel dogによって、dogインスタンスは削除されて、Good Byeが出力されたあと、cat.say()メソッドを実行、最後にクラス内のデストラクタによって、catインスタンスが削除されて再びGood Byeが実行されています。

16行目のdel dogがなければ、最後の行のcat.say()が実行されたあと、Good Byeが2回出力されることになります。

詳しくはこちらの記事をごらんください。

それでは本日の学習にはいりましょう!

クラスの継承

クラスの定義を学習した時点で、少しだけふれましたが、いよいよクラスの継承について学習します。

改めて、Pythonの公式ドキュメントの【クラス】のチュートリアルを確認しても、クラスの定義にobjectの記述がないので、特に問題がないかと思って、今回からobjectを記述しないことにします。

クラスの継承は、ベースとなるクラスのメソッドを引き継いで、さらにメソッドを加えるときに活用します。

class Suzuki:
    def looks(self):
        print('good looking')

class Suzuki_a(Suzuki):
    pass

suzuki_a = Suzuki_a()
suzuki_a.looks()

出力結果

good looking

以前ちらっと学習しましたが、6行目のpassは、何もしないという意味のコードです。

つまり、Suzuki_aクラスは何もしないクラスなのですが、オブジェクトにSuzukiクラスを指定していることで、Suzukiクラスが持つlooksメソッドが使えるようになります。

なので、8行目でSuzuki_aクラスから生成したインスタンスであるsuzuki_alooksメソッドが使えるということです。

継承クラスにメソッドを追加

次に、さらにSuzukiを継承したもう一つのクラスを作って、メソッドを追加してみます。

class Suzuki:
    def looks(self):
        print('good looking')

class Suzuki_a(Suzuki):
    pass

class Suzuki_b(Suzuki):
    def intel(self):
        print('smart')

suzuki_b = Suzuki_b()
suzuki_b.looks()
suzuki_b.intel()

出力結果

good looking
smart

8〜10行目でSuzukiを継承したSuzuki_bを定義して、さらに、intelメソッドを追加しました。

Suzuki_bには、ベースクラスであるSuzukiと自分自身のメソッドが定義されているので、13行目でgood looking、14行目でsmartが出力されます。

しかし、Suzuki_aのインスタンスを作って、Suzuki_bで定義されているintelメソッドを使うことはできません。

継承したクラスをさらに継承

この使い方がいいのかどうかはわかりませんが、ベースクラスを継承したクラスをさらに継承してみるとどうなるか試してみました。

class Suzuki:
    def looks(self):
        print('good looking')

class Suzuki_b(Suzuki):
    def intel(self):
        print('smart')

class Suzuki_c(Suzuki_b):
    pass

suzuki_c = Suzuki_c()
suzuki_c.intel()
suzuki_c.looks()

出力結果

smart
good looking

エラーが起こるかと思いましたが、普通にSuzukiを継承したSuzuki_bを継承したSuzuki_cから生成したインスタンスsuzuki_cで、2つのメソッドを実行することができました。

この使い方がはたして必要かどうかは別として、できるということがわかりましたね。

好奇心は大切

まず、最後に試したようなベースクラスを継承したクラスをさら継承したクラスなんてものを作ってみようと思う人はあまりいないのではないでしょうか?

酒井さんの講座の中では紹介されていませんし、これまで使用してきたベースクラスであるというobjectの記述にしても、書くのが暗黙のルールと紹介されていたので、普通の人なら、objectを記述するんだと思います。

Pythonを使えるようになるということは、教科書どおりのことだけでなく、自由な発想をもって、プログラムを組み立てられるようになるということなので、教科書どおりのことをやっていても、Pythonをマスターしたことにはなりません。

とうぜん、きちんとしたルールにしたがってコードを記述する必要がありますが、

  • こうすればどうなるんだろう?
  • これはできるんだろうか?
  • それってほんと?

という疑問や好奇心を持ったのなら、まずは試してみることが大切です。

いろいろ試して、いろいろと失敗して、いろいろなことを学んでいけるわけですから。

それでは今日はこのへんで。

明日も元気にGood Python!