ProgateでPythonを学ぶ【コース5はオブジェクト指向の続き】

ProgateでPythonコース5

progate python コース5

progateのpythonコースは全5コースあります。コース5は最終コースになりますね。

コース2,3あたりは途中から有料会員にならないと先にすす見たい人は980円払う必要があります。

本でpythonを学びたいという人はこちらがおすすめです。

この本はかなり実用的なんだけど、オブジェクト指向が出てこないんですよね。オブジェクト指向を学びたいひとはProgateやったほうがいいかもしれないですね。

それかもしくは今までの記事をみていただけるとよいかもしれません。

それでは備忘録的にかいていこうと思います。


クラスの継承

コースはいきなりクラスの継承からはじまります。クラスの継承はクラスに新しい機能を追加するときにいちから作るのが面倒なのですでに作っているクラスを継承してそこに新しい機能を追加していくという感じですね。継承元は親クラス 新しく作ったクラスは生み出されるので子クラス。

pythonのクラス継承は extend や < 記号を使わず class 子クラス名(親クラス名):と書くようですね。


#親クラスが定義されたファイル parent.py
class Parent:
    pass

#子クラスが定義されたファイル child.py
from parent import Parent #親クラスを読みこむ
class Child(Parent):
    pass

親クラスを継承すると
親クラスのインスタンスメソッドや __init__メソッドが使えます。__init__メソッドはインスタンス生成時に自動で呼び出されるメソッドのことですね。

継承されたインスタンスメソッドを使う

継承の関係がわかりづらいので、3つのファイルをかいていきたいと思います。

MenuItemクラスが定義された menu_item.py

class MenuItem:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def info(self):
        return self.name + ': ¥' + str(self.price)

    def get_total_price(self, count):
        total_price = self.price * count

        if count >= 3:
            total_price *= 0.9

        return round(total_price)

MenuItemクラスを継承したFoodクラスが定義された foor.py

from menu_item import MenuItem

class Food(MenuItem):
    pass

メインの処理を行う script.py

from food import Food

food1 = Food("サンドイッチ", 500)
print(food1.info())

FoodクラスはMenuItemクラスを継承しているのでMenuItemクラスのインスタンスメソッドinfo()が使えますね。script.pyではfood1というインスタンスにinfo()メソッドを呼び出しています。

pythonのインスタンス変数

pythonのインスタンス変数は筆者もちょっと謎ですが、インスタンスさえあればどこでも宣言できるみたいですね。PHPとかRubyだったらインスタンス変数をあらかじめ宣言しておいてそこからアクセスすると思うのですが、Pythonの場合はその場でインスタンス変数の定義も値の初期化もできるというイメージですね。

以下はFoodクラスのインスタンス変数を定義した例と Foodクラスに(子クラス)にメソッドを追加した例です

MenuItemクラスが定義された menu_item.py

class MenuItem:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def info(self):
        return self.name + ': ¥' + str(self.price)

    def get_total_price(self, count):
        total_price = self.price * count

        if count >= 3:
            total_price *= 0.9

        return round(total_price)

MenuItemクラスを継承したFoodクラスが定義された foor.py

from menu_item import MenuItem

class Food(MenuItem):
    def calorie_info(slef):#子クラスにメソッドを追加する
        print(str(self.calorie) + "kcalです")

メインの処理を行う script.py

from food import Food

food1 = Food("サンドイッチ", 500)
food1.calorie = 330 #ここでインスタンス変数の定義
food1.calorie_info()

メソッドのオーバーライド

メソッドオーバーライドは親クラスのインスタンスメソッドを子クラスで上書きすることですね。インスタンスメソッドもそうですが __init__メソッドも上書きできます。__init__メソッドはインスタンスを生成したら自動で呼ばれるメソッドですね。

先ほどの3つのファイルの中でMenuItemクラスのinfoメソッドをオーバーライドした例

Foodクラスが定義されたfood.py

from menu_item import MenuItem

class Food(MenuItem):
    def info(self):
        return self.name + ': ¥' + str(self.price) + ' (' + str(self.calorie) + 'kcal)'
    def calorie_info(self):
        print(str(self.calorie) + 'kcalです')

__init__メソッドのオーバーライド

__init__メソッドをインスタンス生成時に自動で呼び出されるメソッドでインスタンス変数の初期化によくつかわれる印象があります。個人的になるのですがpythonのインスタンス変数はちょっとわかりにくいので、__init__メソッドで全部初期化したほうがよいかもしれないですね。

先ほどの3つのファイルから全部つづいているとおもってみてください↓
Foodクラス(MenuItemクラスの子クラス)で__init__()メソッドをオーバーライドする↓

from menu_item import MenuItem
class Food(MenuItem):
    # __init__メソッドを定義してください
    def __init__(self, name, price, calorie):
        self.name = name
        self.price = price
        self.calorie = calorie#ここが親と違うとこ

インスタンス呼び出し時は引数をちゃんと設ける

from food import Food
food1 = Food("たこやき", 800, 400)

どこでもインスタンス変数があるとごっちゃになりそうですから __init__メソッドで初期化するのがいいきがします。

super()

superは親クラスのメソッドをよびだせるやつですね。よく継承したときにインスタンス変数がかぶるのでsuper()をよんで楽しようというやつですね。別につかわなくてもいいわけですが。

親の__init__メソッドを呼び出いのだったら super().__init__() というような書き方をします。ピリオドでつないでますね。

注意点としてはsuper()で__init__メソッドを呼び出しているわけではないので引数にselfがいらないってことですね。ちょっとややこしいかもしれないですがメソッド呼び出しでselfを書く必要がないと覚えておけばいいような気がします。

先ほどからつづいている。MnueItemの子クラスFoodクラスの__init__メソッドで親の__init__メソッドを呼び出してインスタンスの変数の初期化定義を省略する書き方↓

form menu_item import MenuItem
class Food(MenuItem):
    def __init__(self, name, price, calorie):
        # super()を用いて、親クラスの__init__()を呼び出してください
        super().__init__(name, price)
        self.calorie = calorie

Progate Pythonコース5まとめ

pythonコースは全5コースでこのコース5で最後になります。コース5は結構難しかったですね。今回学んだことは下記のようなものでしょうか

  • クラスの継承 → クラスを引きつぐ 書き方は class 子クラス名(親クラス名)
  • メソッドオーバーライド → 親クラスのメソッドを子クラスで書き換える
  • __init__メソッドのオーバーライド → __init__はインスタンス生成時自動で呼ばれるメソッドこれも子クラスでオーバーライド可能
  • super() → super()で親のメソッドを呼び出すことが可能__init__でよく使う。書き方はsuper().__init__()

学んだ項目こそ少ないですが難易度は高めでした。この記事ではふれませんでしたが、インスタンスを配列にしてそれを処理していくというのは結構よく使うようですね。個人的にはpythonのインスタンス変数がちょっと変わってるなと思いましたが根本的な考え方は他のプログラミング言語とあまり変わらないきがしています。

以上