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

Progate pythonコース4

Progateでpythonコース2

Progateはプログラミングの学習サービスになります。pythonのコースは全部で5つのコースがあります。

今回はコース4で学んだことをまとめていきたいと思います。

今までのコースの内容は下記のとおりです。

  • pythonコース1は文字列や数式の操作、条件分岐
  • pythonコース2はリスト、辞書、繰り返し、型変換
  • pythonコース3は関数関係

このような基本的な内容を本で学びたいという方にはこちらがおすすめです↓

それでは学んだ内容を備忘録的に書いていきたいと思います。

クラス

コース4はいきなりクラスからはじまります。

pythonのクラスの書き方は class クラス名: とかきます。行末がコロンになっているのが特徴Pythonは波括弧をとかをつかわずendとかもないので非常にシンプルになりますね。

以下はクラスを定義した例

class Menu:
    pass#なにもないときはpass

インスタンスを生成する

見方にもよりますがpythonのインスタンス生成は特殊で new キーワードを使いません。

書き方は 変数 = クラス名() のように記述します。非常にシンプルですね。

class Menu:
    pass

menu1 = Menu()

インスタンス変数

これも人によるかと思うのですがpythonのインスタンス変数はおどろくことにプロパティやフィールドのような書き方はしません。説明ではちょっとわかりにくいのでコードをみたらわかるかと思います。

class Menu:
    pass

menu1 = Menu()
menu.name = "カレー"
print(menu.name)# カレー

このようにインスタンスに対して自由に変数を設定できるようになっています。これはpythonの特徴かと思います。

インスタンスメソッド

インスタンスメソッドはインスタンスに使用するためのメソッドですね。実際にはクラスの中で定義されたメソッドという認識でよいかと思います。

ただインスタンスメソッドは通常のメソッドとちがって第一引数にselfをもたなければならないという決まりがあるようです。これはインスタンスメソッドん場合は必ずselfとしなければならないようですね。意味はともかく決まりとして覚えておいたほうがいいですね。あとはインスタンスメソッドのアクセスは.ピリオドを使って行っていることもポイントですね

Rubyのselfと混乱しそうですが

def メソッド名(self):

class Menu:
    pass
    def taste(self):
        print("おいしいです")

menu1 = Menu()
menu.name = "カレー"
print(menu.name)# カレー
print(menu.taste)

pythonのselfの考え方

pythonのselfの考え方はちょっと特殊で先ほどは メソッドの引数にselfを指定したわけですが、このselfはインスタンス自身のことを指しているのですね。こうしてみると他の言語と考え方はあまり変わらない気がしますね。

ですが、プロパティやフィールドと少し考え方が違うので少し混乱しそうです。

図にするとこんな感じですね。

python self

このselfを使って、インスタンス変数にアクセスするわけですね。こうみると、他の言語と根本的な考え方は一緒な気がします。

以下はselfを使ってインスタンス変数にアクセスしている例になります。

class MenuItem:
    def info(self):
        # 「○○: ¥□□」となるように出力してください
        print(self.name + ": ¥" + str(self.price))
        
menu_item1 = MenuItem()
menu_item1.name = 'サンドイッチ'
menu_item1.price = 500
menu_item1.info()

self以外の引数をもったインスタンスメソッド

インスタンスメソッドは先ほども学んだようにselfを必ず引数にもたせるわけですが、self以外に引数をもたせたインスタンスメソッドの例が下記になります

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

    def get_total_price(self, count):
        total_price = self.price * count
        return total_price
        
menu_item1 = MenuItem()
menu_item1.name = 'サンドイッチ'
menu_item1.price = 500
print(menu_item1.info())
result = menu_item1.get_total_price(4)
print("合計は" + str(result) + "円です")

メソッド呼び出しのときはselfは関係ないのでget_total_price(4)として 引数countの分だけ呼び出しています。

__init__

pythonの__init__は 他のプログラミング言語で言われているコンストラクターとかRubyだったらinitializeメソッドと同等のものかと思います。こちらの__init__メソッドはインスタンスが生成されると自動で呼び出されるメソッドです

書き方に注意点があって def __init__(self):とかきます。引数のselfに注目でselfを必ず引数にもたせないといけないようですね。

以下は__init__メソッドを使った例です

class MenuItem:
    
    def __init__(self):
        print("MenuItemクラスのインスタンスが生成されました!")

menu_item1 = MenuItem()#MenuItemクラスのインスタンスが生成されました!

__init__メソッドでインスタンス変数を初期化する

__init__メソッドはインスタンス生成した時点で自動で呼ばれるので、ここでインスタンス変数の初期化を行うのが通常の使い方のようですね。この作業は他プログラミング言語のコンストラクターと同様の考え方かとおもいます。

ただちょっと他のプログラミング言語と書き方が違いますが、そこは別に意識する必要はないでしょう。

以下は__init__メソッドでインスタンス変数の初期化を行っています。

class MenuItem:
    def __init__(self):
        self.name = "サンドイッチ"
        self.price = 500

menu_item1 = MenuItem()

引数をもった__init__メソッド

__init__メソッドに引数をもたせてインスタンス変数に代入します。他プログラミング言語でもよく見られるやり方ですね。

__init__メソッドに引数をもたせた場合はインスタンス生成するときに引数に値を設定しなければならないですね

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

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

menu_item1 = MenuItem("サンドイッチ", 500)#initメソッドが呼ばれ値がインスタンス変数が初期化される
print(menu_item1.info())

クラス定義ファイルの分割とfrom import文

クラスが定義されたmenu_item.pyファイルを読み込む場合は importを使うのですが、from import文を使うと直接クラスが読みこめるようになるようです。

import モジュール名 → クラスを使う場合は モジュール名.MenuItem() → これでは毎回モジュール名指定が面倒
from モジュール名 import クラス名 → MenuItem() → そのままクラスを使用することができる

インスタンスのリスト

インスタンスをリストにしてfor文でひとつずつ取り出しinfoメソッドを呼び出します。

クラスが定義されたファイル 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
        return total_price

メインのファイル script.py

from menu_item import MenuItem

menu_item1 = MenuItem('サンドイッチ', 500)
menu_item2 = MenuItem('チョコケーキ', 400)
menu_item3 = MenuItem('コーヒー', 300)
menu_item4 = MenuItem('オレンジジュース', 200)

menu_items = [menu_item1, menu_item2, menu_item3, menu_item4]

for menu_item in menu_items:
    print(menu_item.info())

Progate Pythonコース4まとめ

ProagteのPythonコース4は学ぶことが多いと感じました。学んだ内容は下記のとおりでしょうか

  • クラス
  • インスタンスの生成 → newは使わず クラス名()がインスタンス生成
  • インスタンス変数 → pythonのインスタンス変数は少し特殊
  • インスタンスメソッド → def メソッド名(self)引数に必ずselfを設ける
  • __init__メソッド → def __init__(self) インスタンス生成のときに自動で呼ばれるselfを必ず引数に設ける。インスタンス変数の初期化を行うことができる。その場合は引数をもたせて中の処理で初期化を行う
  • from import文によるクラスの読み込み

人によるとは思いますが、筆者はインスタンス変数とインスタンスメソッドがすこし他のプログラミング言語と違うように感じました。しかし根本的な考え方、インスタンス自身を使ってアクセスするというの同じかと思います。

次の記事はProgateでPythonを学ぶ【コース5はオブジェクト指向の続き】 | 初心者のプログラミング


Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 49

Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 78