シンプルなオブジェクトを定義する

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、株式情報を表すためのシンプルな Python クラスを定義する方法を学びます。クラスはオブジェクト指向プログラミングにおける重要な概念であり、現実世界のエンティティをモデル化し、コードをより効率的に構造化することができます。

この実験の目的は、シンプルな Python クラスを定義する方法を学ぶこと、クラス属性とメソッドを理解すること、クラスインスタンスを作成して相互作用すること、およびオブジェクト情報を表示するための書式設定を適用することです。この実験中に stock.py ファイルが作成されます。

これは Guided Lab です。学習と実践を支援するためのステップバイステップの指示を提供します。各ステップを完了し、実践的な経験を積むために、指示に注意深く従ってください。過去のデータによると、この 初級 レベルの実験の完了率は 97%です。学習者から 100% の好評価を得ています。

Python クラスの理解

Python では、クラスはオブジェクトを作成するためのブループリントとして機能します。オブジェクト指向プログラミングは、コードを効果的に整理する強力なアプローチです。関連するデータと関数をグループ化することで、複雑なプログラムをより簡単に管理し、コードをよりモジュール化して保守しやすくすることができます。

Python のクラスは、主に 2 つの要素で構成されています。

  • 属性(Attributes):これはクラス内にデータを格納する変数です。属性はオブジェクトの特性や性質と考えることができます。たとえば、人を表すクラスを作成する場合、属性はその人の名前、年齢、身長などになります。
  • メソッド(Methods):これはクラスに属する関数で、クラスの属性にアクセスしたり変更したりすることができます。メソッドはオブジェクトが実行できるアクションを定義します。人クラスの例では、メソッドは人の月齢を計算する関数になります。

クラスは、再利用可能なコードを作成し、現実世界の概念をモデル化する方法を提供するため、非常に有用です。この実験では、Stock クラスを作成します。このクラスは、株式の名前、株数、株価などの株式情報を表すために使用されます。

以下は Python クラスの基本構造です。

class ClassName:
    def __init__(self, parameter1, parameter2):
        self.attribute1 = parameter1
        self.attribute2 = parameter2

    def method_name(self):
        ## Code that uses the attributes
        return result

__init__ メソッドは Python クラスの特殊なメソッドです。クラスから新しいオブジェクトを作成すると自動的に呼び出されます。このメソッドはオブジェクトの属性を初期化するために使用されます。self パラメータはクラスのインスタンスへの参照です。クラス内から属性やメソッドにアクセスするために使用されます。オブジェクトに対してメソッドを呼び出すと、Python は自動的にオブジェクト自体を最初の引数として渡します。これが、メソッド定義で self を使用する理由です。これにより、特定のインスタンスの属性を操作し、それらに対して演算を行うことができます。

Stock クラスの作成

Python では、クラスはオブジェクトを作成するためのブループリントです。データと機能をまとめることができます。では、株式情報を表す Stock クラスを作成しましょう。株式には、名前、株数、株価などの特定の特性があります。これらの要素に対応する属性をクラス内で定義します。

  1. まず、WebIDE で正しいディレクトリにいる必要があります。もし /home/labex/project ディレクトリにいない場合は、そこに移動してください。ここで Stock クラスのコードを作成します。

  2. 正しいディレクトリに移動したら、エディタで新しいファイルを作成します。このファイルを stock.py と名付けます。このファイルに Stock クラスのコードを記述します。

  3. 次に、Stock クラスを定義するコードを追加しましょう。以下のコードを stock.py ファイルにコピーして貼り付けてください。

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

    def cost(self):
        return self.shares * self.price

このコードでは:

  • class Stock: 文は Stock という名前の新しいクラスを作成します。これは株式オブジェクトを作成するためのテンプレートのようなものです。
  • __init__ メソッドは Python クラスの特殊なメソッドで、コンストラクタと呼ばれます。Stock クラスの新しいオブジェクトを作成すると、__init__ メソッドが自動的に実行されます。このメソッドは 3 つのパラメータ namesharesprice を受け取ります。これらのパラメータは株式に関する情報を表します。
  • __init__ メソッド内では、self を使ってクラスのインスタンスを参照します。パラメータの値をインスタンス属性として保存します。たとえば、self.name = namename パラメータをオブジェクトの属性として保存します。
  • cost() メソッドは独自に定義したメソッドです。株数 (self.shares) と株価 (self.price) を掛け合わせて、株式の総コストを計算します。
  1. コードを追加したら、ファイルを保存します。Ctrl+S を押すか、保存アイコンをクリックすることで保存できます。ファイルを保存することで、変更内容が保存されます。

コードをもう一度見て、理解していることを確認しましょう。

  • Stock という名前のクラスを定義しました。このクラスは株式オブジェクトを作成するために使用されます。
  • __init__ メソッドは 3 つのパラメータ namesharesprice を受け取ります。これらの値でオブジェクトの属性を初期化します。
  • __init__ 内では、self を使ってこれらのパラメータをインスタンス属性として保存します。これにより、各オブジェクトがこれらの属性に独自の値を持つことができます。
  • 株数と株価を掛け合わせて総コストを計算する cost() メソッドを追加しました。これは株式オブジェクトにとって便利な機能です。

Stock オブジェクトを作成すると、__init__ メソッドが自動的に実行され、提供した値でオブジェクトの初期状態が設定されます。このようにして、異なる名前、株数、株価を持つ複数の株式オブジェクトを簡単に作成することができます。

株式オブジェクトの作成

Stock クラスを定義したので、実際に使ってみましょう。クラスのインスタンスを作成することは、一般的なブループリントに基づいて具体的な例を作るようなものです。この場合、Stock クラスがブループリントで、いくつかの株式オブジェクトを作成します。これらのオブジェクトを作成した後、それらの属性(特性)とメソッド(実行できるアクション)にアクセスする方法を学びます。

  1. まず、WebIDE でターミナルを開く必要があります。ターミナルは、コンピュータに命令を与えることができるコマンドセンターのようなものです。開くには、メニューの「Terminal」をクリックします。

  2. ターミナルが開いたら、正しいプロジェクトディレクトリにいることを確認します。プロジェクトディレクトリは、プロジェクトに関連するすべてのファイルが保存されている場所です。まだプロジェクトディレクトリにいない場合は、次のコマンドを使用して移動します。

cd /home/labex/project
  1. 次に、stock.py ファイルを使って Python を対話モードで起動します。対話モードでは、コードをステップバイステップでテストし、すぐに結果を確認することができます。stock.py ファイルには Stock クラスの定義が含まれています。次のコマンドを使用します。
python3 -i stock.py

ここで -i フラグは重要です。これは Python に stock.py スクリプトを最初に実行するように指示します。スクリプトを実行した後、対話セッションを開始します。このセッションでは、stock.py スクリプトで定義されたすべてのクラスと変数にアクセスすることができます。

  1. では、Google の株式について新しい Stock オブジェクトを作成しましょう。オブジェクトを作成することは、特定の値を持つ Stock クラスの具体的なインスタンスを作るようなものです。次のコードを使用します。
s = Stock('GOOG', 100, 490.10)

このコード行は Stock クラスの新しいインスタンスを作成します。各値の意味は次の通りです。

  • 名前:'GOOG' - これは Google 株式のシンボルです。
  • 株数:100 - これは持っている Google 株式の数を表します。
  • 株価:490.10 - これは Google 株式の 1 株あたりの価格です。
  1. Stock オブジェクトができたので、その属性にアクセスすることができます。属性はオブジェクトの特性のようなものです。属性にアクセスするには、オブジェクトの名前の後にドットと属性名を付けます。
s.name

このコードを実行すると、株式の名前が出力されます。

'GOOG'

株数にアクセスしてみましょう。

s.shares

出力は定義した株数になります。

100

最後に、1 株あたりの価格にアクセスします。

s.price

出力は 1 株あたりの価格になります。

490.1
  1. Stock クラスには cost() というメソッドがあります。メソッドはオブジェクトが実行できるアクションのようなものです。この場合、cost() メソッドは株式の総コストを計算します。このメソッドを呼び出すには、次のコードを使用します。
s.cost()

出力は総コストになります。

49010.0

cost() メソッドは、株数(100)に 1 株あたりの価格(490.10)を掛けることで動作し、49010.0 を得ます。

複数の株式オブジェクトを扱う

オブジェクト指向プログラミングにおいて、クラスはブループリントのようなもので、そのクラスのインスタンスはそのブループリントに基づいて作成される実際のオブジェクトです。私たちの Stock クラスは株式を表すためのブループリントです。この Stock クラスの複数のインスタンスを作成して、異なる株式を表すことができます。各インスタンスは、株式名、株数、株価などの独自の属性セットを持ちます。

  1. Python の対話セッションがまだ実行されている状態で、もう 1 つの Stock オブジェクトを作成します。今回は IBM を表すオブジェクトを作成します。Stock クラスのインスタンスを作成するには、クラス名を関数のように呼び出し、必要な引数を渡します。ここでの引数は、株式名、株数、株価です。
t = Stock('IBM', 50, 91.5)

このコード行では、IBM を表す新しい Stock オブジェクト t を作成しています。このオブジェクトは 50 株を持ち、1 株あたりの価格は 91.5 ドルです。

  1. 次に、この新しい株式のコストを計算します。Stock クラスには cost() というメソッドがあり、株数に株価を掛けることで株式の総コストを計算します。
t.cost()

このコードを実行すると、Python は t オブジェクトの cost() メソッドを呼び出し、総コストを返します。

出力:

4575.0
  1. Python の文字列フォーマットを使用して、株式情報を見やすく整理して表示することができます。文字列フォーマットを使うと、異なる型のデータを文字列内でどのように表示するかを指定できます。
print('%10s %10d %10.2f' % (s.name, s.shares, s.price))

このコードでは、Python の古いスタイルの文字列フォーマットを使用しています。% 演算子は、文字列をテンプレートとして、値を置き換えるために使用されます。文字列テンプレート '%10s %10d %10.2f' は、株式名、株数、株価がどのようにフォーマットされるかを定義しています。

出力:

      GOOG        100     490.10

このフォーマットされた文字列は次のように動作します。

  • %10s は、10 文字幅のフィールドに文字列を右詰めでフォーマットします。つまり、株式名は 10 文字幅のスペースに配置され、そのスペース内で右詰めになります。
  • %10d は、10 文字幅のフィールドに整数をフォーマットします。したがって、株数は 10 文字幅のスペースに配置されます。
  • %10.2f は、10 文字幅のフィールドに小数点以下 2 桁の浮動小数点数をフォーマットします。株価は小数点以下 2 桁で表示され、10 文字幅のスペースに配置されます。
  1. では、同じ方法で IBM の株式情報をフォーマットしましょう。文字列フォーマットのコードでオブジェクト名を s から t に置き換えるだけです。
print('%10s %10d %10.2f' % (t.name, t.shares, t.price))

出力:

       IBM         50      91.50
  1. 現代の Python では、f - 文字列も使用してフォーマットすることができます。f - 文字列は読みやすく、使いやすいです。f - 文字列を使って両方の株式のコストを比較してみましょう。
print(f"Google stock costs ${s.cost()}, IBM stock costs ${t.cost()}")

この f - 文字列では、中括弧 {} の中に式を直接埋め込んでいます。Python はこれらの式を評価し、結果を文字列に挿入します。

出力:

Google stock costs $49010.0, IBM stock costs $4575.0
  1. 実験が終了したら、Python の対話モードを終了しましょう。exit() 関数を使用することでこれを行うことができます。
exit()

Stock オブジェクトは独自の属性セットを保持しており、これはオブジェクト指向プログラミングにおけるクラスインスタンスの動作を示しています。これにより、同じメソッドを共有しながら、それぞれ異なる値を持つ複数の株式オブジェクトを作成することができます。

株式クラスの機能拡張

Python において、クラスはデータと振る舞いを整理する強力な手段です。関連するデータと関数をまとめることができます。このセクションでは、フォーマットされた株式情報を表示するメソッドを追加することで、Stock クラスを拡張します。これは、データと振る舞いの両方をクラスにカプセル化できる素晴らしい例です。カプセル化とは、データとそのデータを操作するメソッドをまとめることで、コードを整理し、管理しやすくすることを意味します。

  1. まず、WebIDE のエディタで stock.py ファイルを開く必要があります。stock.py ファイルは、Stock クラスを開発してきた場所です。エディタで開くことで、クラス定義に変更を加えることができます。

  2. 次に、Stock クラスを修正して、新しい display() メソッドを追加します。このメソッドは、株式情報を見やすくフォーマットして出力する役割を担います。以下のように実装できます。

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

    def cost(self):
        return self.shares * self.price

    def display(self):
        print(f"Stock: {self.name}, Shares: {self.shares}, Price: ${self.price:.2f}, Total Cost: ${self.cost():.2f}")

__init__ メソッドでは、株式の名前、株数、価格を初期化します。cost メソッドは、株数に価格を掛けることで株式の総コストを計算します。新しい display メソッドは、f - 文字列を使用して、株式の名前、株数、価格、総コストを含む株式情報をフォーマットして出力します。

  1. これらの変更を加えた後、ファイルを保存する必要があります。キーボードで Ctrl+S を押すか、エディタの保存アイコンをクリックすることで保存できます。ファイルを保存することで、変更が保存され、後で使用できるようになります。

  2. 次に、新しい Python の対話セッションを開始します。対話セッションを使うと、すぐにコードをテストすることができます。セッションを開始するには、ターミナルで以下のコマンドを実行します。

python3 -i stock.py

-i オプションは、Python に stock.py ファイルを実行した後に対話セッションを開始するよう指示します。これにより、すぐに Stock クラスとそのメソッドを使用することができます。

  1. では、株式オブジェクトを作成し、新しい display() メソッドを使用してみましょう。Apple の株式を表すオブジェクトを作成し、display メソッドを呼び出して、フォーマットされた情報を確認します。以下がコードです。
apple = Stock('AAPL', 200, 154.50)
apple.display()

このコードを対話セッションで実行すると、以下の出力が表示されます。

Stock: AAPL, Shares: 200, Price: $154.50, Total Cost: $30900.00

この出力は、display メソッドが正しく動作し、株式情報を期待通りにフォーマットしていることを示しています。

  1. 最後に、株式のリストを作成し、すべての株式情報を表示しましょう。これにより、複数の株式オブジェクトで display メソッドを使用できることがわかります。以下がコードです。
stocks = [
    Stock('GOOG', 100, 490.10),
    Stock('IBM', 50, 91.50),
    Stock('AAPL', 200, 154.50)
]

for stock in stocks:
    stock.display()

このコードを実行すると、以下の出力が得られます。

Stock: GOOG, Shares: 100, Price: $490.10, Total Cost: $49010.00
Stock: IBM, Shares: 50, Price: $91.50, Total Cost: $4575.00
Stock: AAPL, Shares: 200, Price: $154.50, Total Cost: $30900.00

display() メソッドをクラスに追加することで、フォーマットロジックをクラス自体にカプセル化しました。これにより、コードがより整理され、保守が容易になります。株式情報の表示方法を変更する必要がある場合、コード全体に変更を加えるのではなく、display メソッドを 1 箇所で修正するだけで済みます。

まとめ

この実験では、属性とメソッドを持つ Python のクラスを定義し、特定の属性値を持つクラスのインスタンスを作成し、オブジェクトの属性にアクセスし、オブジェクトのメソッドを呼び出す方法を学びました。また、オブジェクト情報を様々な方法でフォーマットして表示し、同じクラスの複数のオブジェクトを扱い、新しいメソッドを追加してクラスを拡張する方法も学びました。

これらのオブジェクト指向プログラミングの概念は Python において基本的なものであり、大規模なアプリケーションでコードを整理するための基礎となります。クラスは関連するデータと機能をまとめるのに役立ち、コードをよりモジュール化し、保守しやすくします。さらにスキルを向上させるために、Stock クラスにデータ検証、株数や価格を更新するメソッド、利益または損失を計算するメソッドなどの機能を追加することを検討してみてください。