Site icon imageTomoMemo.dev

Memo on programming. Provided by Tomo with passion.

[Python]Classを定義してInstanceを作ってみる(&辞書の詳細解説)」

Icon in a callout block
Python 100Days Challenge Day14

Day13と内容が重複するところがあるが改めて復習。

例を挙げた上でclassを定義してInstanceを生成してみる。

まずはオブジェクト。

オブジェクトにはデータ(attribute)とデータを操作するための関数(method)が含まれる。

そして、これらを作成するための設計図的なものであり、データ(attribute)とデータを操作するための関数(method)をひとまとめにしたものクラス(class)と呼ぶ。

クラスとオブジェクトの違い(&インスタンス)
  • クラス
    • データ(attribute)とデータを操作するための関数(method)をひとまとめにしたもの。例えば、「犬」というクラスを作ると、それはすべての犬が持つ共通の特徴を定義する
      • 犬(class)
        • 名前(attribute)
        • 年齢(attribute)
        • 種類(attribute)
        • 吠える(method)

  • オブジェクト
    • クラスをもとに作られた実体。例えば、「Buddy」という名前の犬は「犬」クラスのオブジェクトになる。「Buddy」が3歳であるなら、3歳という情報もオブジェクトになる。
      • 犬(class)
        • 名前(attribute) → Buddy(object)
        • 年齢(attribute) → 3歳(object)

  • インスタンス
    • オブジェクトの1つであり、オブジェクトが特定のクラスに属していることを強調するときに使う言葉。
      • 狼犬(class)
        • 名前(attribute) → Calvin(object)
        • 年齢(attribute) → 1歳(object)
        • 遠吠えをする(method)

    上記の犬クラスに加えて、狼犬というクラスを作成し、Calvinという名前の狼犬を定義してみた。

    このとき

    Buddyは犬クラスのインスタンスであり、

    Calvinは狼犬クラスのインスタンスである、と言える。

    それぞれ、犬クラス、狼犬クラスで定義されているメソッドを使用できる。

    ここまでが復習。

    では、実際にclass定義をしてIntanceを作ってみる

    ショッピングカートクラスからインスタンスを作る

    ショッピングカートクラスはアイテムを追加したり、合計金額を計算する機能を持っている

    class ShoppingCart:
        def __init__(self):
            self.items = [] # カートのアイテムを保存するリスト(初期値は空にしておく)
        
        def add_item(self, item, price):
            # アイテム(名前と価格)を辞書形式でカートに追加できるようにする
            self.items.append({'item': item, 'price': price})
        
        def total_price(self):
            # カート内すべてのアイテム価格の合計値を計算する
            total = sum(item['price'] for item in self.items)
            return total
        
        def show_cart(self):
            for item in self.items:
                # カート内全てのアイテム名と金額を表示する
                print(f"Item: {item['item']}, Price: {item['price']}"})
    
    # ショッピングカートのインスタンスを作成する
    cart = ShoppingCart()
    
    # アイテムをショッピングカートに追加する
    cart.add_item("Apple", 100)
    cart.add_item("Banana", 150)
    
    # カート(インスタンス)の中身を見る
    cart.show_cart()
    >
    Item: Apple, Price: 100円
    Item: Banana, Price: 150# 合計金額を計算する(インスタンスを出力する)
    print(f"Total Price: {cart.total_price()}円")
    >
    Total Price: 250

    ここで出てきた辞書というデータ構造について見直す。

    コードベースのいい例ができたので解説。

    辞書の詳細解説

    辞書の基本概念はこちら

    辞書はKeyとvalueのペアを使ってデータを管理する。これを使えばkeyを指定するだけで対応する値を簡単に取り出せる、というルールが存在する。

    # 辞書の例
        def add_item(self, item, price):
            # アイテム(名前と価格)を辞書形式でカートに追加できるようにする
            self.items.append({'item': item, 'price': price})

    このとき、’item’はkey、itemはvalue、’price’はkey、priceはvalue。

    この辞書からvalue、値を取り出すときkeyを使う。

    なぜkeyを使うの?そのまま値を取り出せばいいよね。

    そんなめんどいことする必要ある?と考えたこともあったが、

    これは可読性の観点でやめておいたほうがいい。

    値だけを取り出すことはできなくないが、可読性が一気に落ちる。

    辞書を使わない場合の問題点 - 読みづらい

    辞書を使わない場合の問題点として、コードの可読性が非常に悪くなる、ということが発生する。例えば下記。リストから値を取り出している。

    # リストを使ってアイテムの名前と価格を管理
    item1 = ["Apple", 100]
    item2 = ["Banana", 150]
    
    # リストから値を取り出す
    print(f"Item: {item1[0]}, Price: {item1[1]}円")
    print(f"Item: {item2[0]}, Price: {item2[1]}円")

    これは2つだけしかデータがないので読むことはできるが、データが100個、1000個と増えていくとどのインデックスに何のデータが入っているのかがわかりづらくなる。

    上記のようなマジックナンバーは使わないこと。

    かつ、マジックナンバーを使わざるを得ない場合はコメントで理由を追記すること。

    辞書を使う理由3選
    • データをまとめて管理
      • 辞書をつかうと関連するデータをひとつにまとめて管理できる。例えば、アイテムの名前と価格を一緒に保存できる
      # 辞書を使うと
      item = {'name': 'Apple', 'price': 100}
      # 名前と価格をセットで保存できる

    • わかりやすさ
      • 辞書を使うとデータの意味がわかる。item[’price’]と書けば、それがアイテムの価格を表すことがわかるはず
      # 'price'キーで価格を取り出せる
      print(item['price'])  # 出力: 100

    • 柔軟性が高い
      • 辞書を使うとあたらしい情報を追加しやすい
      # 新しい情報を簡単に追加できる
      item['quantity'] = 3
      item['description'] = 'Fresh red apples'
      print(item)
      
      >
      {'name': 'Apple', 'price': 100, 'quantity': 3, 'description': 'Fresh red apples'}

      逆に、リストを使うとデータ構造を変えるのは大変(読みづらい)

      # リストを使うと
      item = ['Apple', 100]
      # 新しい情報を追加するのが難しい
      
      # 例えば、数量を追加すると
      item.append(3)
      print(item)
      # 出力: ['Apple', 100, 3]
      # これだとどの要素が何を意味しているか分かりにくい

今日はここまで

d( ̄  ̄)

Powered by Tomo with passion.