t_m_o
@t_m_o

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Python

解決したいこと

Pythonのfood.pyのself.name = name
の意味と、他のモデュールのコードとどんな
関係性があるのか、わからない。
頭がこんがらがってしまったので、
わかりやすく説明してください!

全てのコード(一覧)

food.py
from menu_item import MenuItem

class Food(MenuItem):
    # __init__ メソッドを定義してください
    def __init__(self, name, price, calorie):
        self.name = name
        self.price = price
        self.calorie = calorie
    
    def info(self):
        return self.name + ': ¥' + str(self.price) + ' (' + str(self.calorie) + 'kcal)'
    
    def calorie_info(self):
        print(str(self.calorie) + 'kcalです')
script.py
from food import Food
from drink import Drink

# Food() に引数を追加してください
food1 = Food('サンドイッチ', 500, 330)

# 以下の1行は削除してください
# food1.calorie = 330

print(food1.info())

drink1 = Drink('コーヒー', 300)
drink1.amount = 180
print(drink1.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

        if count >= 3:
            total_price *= 0.9

        return round(total_price)

drink.py
from menu_item import MenuItem

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

自分で試したこと

以下がCHAT GPTの回答(説明を見てもわからなかったので、)

Food クラスの __init__ メソッドについて
python
コードをコピーする
class Food(MenuItem):
    def __init__(self, name, price, calorie):
        self.name = name
        self.price = price
        self.calorie = calorie
簡潔な解説と関連性
__init__ メソッドは、クラスのインスタンスが生成されるときに呼び出される特別なメソッドです。このメソッドは、インスタンスの属性(プロパティ)を初期化するために使われます。

self.name = name

name は、Food クラスのインスタンスを作成するときに渡される引数です。この引数の値を、インスタンスの name 属性に設定します。
例: food1 = Food('サンドイッチ', 500, 330) の場合、name は 'サンドイッチ' となり、self.name には 'サンドイッチ' が代入されます。
self.price = price

price も引数として渡され、その値がインスタンスの price 属性に設定されます。
例: price は 500 となり、self.price には 500 が代入されます。
self.calorie = calorie

calorie も引数として渡され、その値がインスタンスの calorie 属性に設定されます。
例: calorie は 330 となり、self.calorie には 330 が代入されます。
__init__ メソッドの役割
__init__ メソッドの役割は、インスタンスが作成されるときにそのインスタンスに必要な初期データを設定することです。上記の例では、Food クラスのインスタンスが作成されるときに、name, price, calorie の3つの属性が設定されます。

info メソッドとの関連
info メソッドでは、これらの属性を使って情報を整形して返しています。具体的には、self.name, self.price, self.calorie の属性を利用して文字列を作成します。

python
コードをコピーする
def info(self):
    return self.name + ': ¥' + str(self.price) + ' (' + str(self.calorie) + 'kcal)'
この info メソッドを呼び出すと、Food インスタンスの名前、価格、カロリーが整形された文字列として出力されます。

Drink クラスとの比較
同様に、Drink クラスも MenuItem クラスを継承し、info メソッドで情報を整形して出力します。ただし、Drink クラスには calorie 属性がない代わりに amount 属性があります。

python
コードをコピーする
class Drink(MenuItem):
    def info(self):
        return self.name + ': ¥' + str(self.price) + ' (' + str(self.amount) + 'mL)'
まとめ
self.name = name, self.price = price, self.calorie = calorie は、それぞれの引数をクラスのインスタンス属性として設定するためのコードです。
__init__ メソッドは、クラスのインスタンスが作成されるときに属性を初期化する役割を持っています。
info メソッドは、これらの属性を使って情報を整形して返すメソッドです。。
0

3Answer

React の質問 のときもそうでしたが、基本的な概念を1つ1つ理解してから複雑なコードに挑むべきです。分かっていない概念がたくさん現れるコードを見て頭がこんがらがるのは当然ですし、そんな状態の人に一から全て教えるのは無理です。

以下、そのコードに出てくる概念で主要なものを分類しました。分かっていないものがあれば1つずつ(できれば手元に参考書を用意して)勉強してください。本を読んでも分からなければ、1つの概念に絞って具体的に質問してください。

  • 「モジュール」の概念
    • モジュールはソースコードを分割し整理する単位のこと
    • モジュールはざっくりいうとソースコードが書かれたファイル1つと対応する
    • モジュールからはクラスや関数を現在の名前空間にインポートできる(「名前空間」の概念)
# コードの例
from モジュール名 import インポートする対象名
  • 「クラス」の概念
    • クラスは手続きとデータをひとまとめにする単位のこと
    • クラスは親クラスから振る舞いを引き継げる(「クラスの継承」の概念)
    • インスタンスの初期化処理は __init__ という特別なメソッドに書く(「メソッド」の概念、「クラスのインスタンス」とその初期化の概念)
    • インスタンス変数への代入はメソッドの中で self.インスタンス変数 = 値 と書く(「インスタンス変数」の概念)
      • 一般にインスタンス変数と呼ばれるものは、 Python ではインスタンスの属性、あるいはインスタンスのプロパティともいう
# コードの例
class クラス名(親クラス名):
    def __init__(self, 引数):
        self.インスタンス変数 = 引数
1Like

Comments

  1. @t_m_o

    Questioner

    はい!丁寧な回答ありがとうございます。
    もう少し、過去のスライドを見なおして
    みたいと思います。

いくつか確認したいです。

Pythonのfood.pyのself.name = name
の意味と、他のモデュールのコードとどんな
関係性があるのか、わからない。

food.pyはご自身が書いたコードですか?別の人が書いたコードでしょうか?
書籍等に載っているのもならば出典を明記された方が良いかと思います。

頭がこんがらがってしまったので、
わかりやすく説明してください!

そもそも何を意図したコードなのでしょうか?コードを読めばわかるでしょう、と思われるかもしれませんが質問に際しては概要を説明すべきだと思います。

以下がCHAT GPTの回答(説明を見てもわからなかったので、)

この説明に何か問題があるのでしょうか?丁寧な説明かと思いますが。

0Like

これはProgateにある演習のひとつと思われる。そもそも、無断転載してはいけないのでは?

0Like

Your answer might help someone💌