はじめに
この実験では、株式情報を表すためのシンプルな Python クラスを定義する方法を学びます。クラスはオブジェクト指向プログラミングにおける重要な概念であり、現実世界のエンティティをモデル化し、コードをより効率的に構造化することができます。
この実験の目的は、シンプルな Python クラスを定義する方法を学ぶこと、クラス属性とメソッドを理解すること、クラスインスタンスを作成して相互作用すること、およびオブジェクト情報を表示するための書式設定を適用することです。この実験中に stock.py ファイルが作成されます。
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 クラスを作成しましょう。株式には、名前、株数、株価などの特定の特性があります。これらの要素に対応する属性をクラス内で定義します。
まず、WebIDE で正しいディレクトリにいる必要があります。もし
/home/labex/projectディレクトリにいない場合は、そこに移動してください。ここでStockクラスのコードを作成します。正しいディレクトリに移動したら、エディタで新しいファイルを作成します。このファイルを
stock.pyと名付けます。このファイルにStockクラスのコードを記述します。次に、
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 つのパラメータname、shares、priceを受け取ります。これらのパラメータは株式に関する情報を表します。__init__メソッド内では、selfを使ってクラスのインスタンスを参照します。パラメータの値をインスタンス属性として保存します。たとえば、self.name = nameはnameパラメータをオブジェクトの属性として保存します。cost()メソッドは独自に定義したメソッドです。株数 (self.shares) と株価 (self.price) を掛け合わせて、株式の総コストを計算します。
- コードを追加したら、ファイルを保存します。
Ctrl+Sを押すか、保存アイコンをクリックすることで保存できます。ファイルを保存することで、変更内容が保存されます。
コードをもう一度見て、理解していることを確認しましょう。
Stockという名前のクラスを定義しました。このクラスは株式オブジェクトを作成するために使用されます。__init__メソッドは 3 つのパラメータname、shares、priceを受け取ります。これらの値でオブジェクトの属性を初期化します。__init__内では、selfを使ってこれらのパラメータをインスタンス属性として保存します。これにより、各オブジェクトがこれらの属性に独自の値を持つことができます。- 株数と株価を掛け合わせて総コストを計算する
cost()メソッドを追加しました。これは株式オブジェクトにとって便利な機能です。
Stock オブジェクトを作成すると、__init__ メソッドが自動的に実行され、提供した値でオブジェクトの初期状態が設定されます。このようにして、異なる名前、株数、株価を持つ複数の株式オブジェクトを簡単に作成することができます。
株式オブジェクトの作成
Stock クラスを定義したので、実際に使ってみましょう。クラスのインスタンスを作成することは、一般的なブループリントに基づいて具体的な例を作るようなものです。この場合、Stock クラスがブループリントで、いくつかの株式オブジェクトを作成します。これらのオブジェクトを作成した後、それらの属性(特性)とメソッド(実行できるアクション)にアクセスする方法を学びます。
まず、WebIDE でターミナルを開く必要があります。ターミナルは、コンピュータに命令を与えることができるコマンドセンターのようなものです。開くには、メニューの「Terminal」をクリックします。
ターミナルが開いたら、正しいプロジェクトディレクトリにいることを確認します。プロジェクトディレクトリは、プロジェクトに関連するすべてのファイルが保存されている場所です。まだプロジェクトディレクトリにいない場合は、次のコマンドを使用して移動します。
cd /home/labex/project
- 次に、
stock.pyファイルを使って Python を対話モードで起動します。対話モードでは、コードをステップバイステップでテストし、すぐに結果を確認することができます。stock.pyファイルにはStockクラスの定義が含まれています。次のコマンドを使用します。
python3 -i stock.py
ここで -i フラグは重要です。これは Python に stock.py スクリプトを最初に実行するように指示します。スクリプトを実行した後、対話セッションを開始します。このセッションでは、stock.py スクリプトで定義されたすべてのクラスと変数にアクセスすることができます。
- では、Google の株式について新しい
Stockオブジェクトを作成しましょう。オブジェクトを作成することは、特定の値を持つStockクラスの具体的なインスタンスを作るようなものです。次のコードを使用します。
s = Stock('GOOG', 100, 490.10)
このコード行は Stock クラスの新しいインスタンスを作成します。各値の意味は次の通りです。
- 名前:'GOOG' - これは Google 株式のシンボルです。
- 株数:100 - これは持っている Google 株式の数を表します。
- 株価:490.10 - これは Google 株式の 1 株あたりの価格です。
Stockオブジェクトができたので、その属性にアクセスすることができます。属性はオブジェクトの特性のようなものです。属性にアクセスするには、オブジェクトの名前の後にドットと属性名を付けます。
s.name
このコードを実行すると、株式の名前が出力されます。
'GOOG'
株数にアクセスしてみましょう。
s.shares
出力は定義した株数になります。
100
最後に、1 株あたりの価格にアクセスします。
s.price
出力は 1 株あたりの価格になります。
490.1
Stockクラスにはcost()というメソッドがあります。メソッドはオブジェクトが実行できるアクションのようなものです。この場合、cost()メソッドは株式の総コストを計算します。このメソッドを呼び出すには、次のコードを使用します。
s.cost()
出力は総コストになります。
49010.0
cost() メソッドは、株数(100)に 1 株あたりの価格(490.10)を掛けることで動作し、49010.0 を得ます。
複数の株式オブジェクトを扱う
オブジェクト指向プログラミングにおいて、クラスはブループリントのようなもので、そのクラスのインスタンスはそのブループリントに基づいて作成される実際のオブジェクトです。私たちの Stock クラスは株式を表すためのブループリントです。この Stock クラスの複数のインスタンスを作成して、異なる株式を表すことができます。各インスタンスは、株式名、株数、株価などの独自の属性セットを持ちます。
- Python の対話セッションがまだ実行されている状態で、もう 1 つの
Stockオブジェクトを作成します。今回は IBM を表すオブジェクトを作成します。Stockクラスのインスタンスを作成するには、クラス名を関数のように呼び出し、必要な引数を渡します。ここでの引数は、株式名、株数、株価です。
t = Stock('IBM', 50, 91.5)
このコード行では、IBM を表す新しい Stock オブジェクト t を作成しています。このオブジェクトは 50 株を持ち、1 株あたりの価格は 91.5 ドルです。
- 次に、この新しい株式のコストを計算します。
Stockクラスにはcost()というメソッドがあり、株数に株価を掛けることで株式の総コストを計算します。
t.cost()
このコードを実行すると、Python は t オブジェクトの cost() メソッドを呼び出し、総コストを返します。
出力:
4575.0
- 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 文字幅のスペースに配置されます。
- では、同じ方法で IBM の株式情報をフォーマットしましょう。文字列フォーマットのコードでオブジェクト名を
sからtに置き換えるだけです。
print('%10s %10d %10.2f' % (t.name, t.shares, t.price))
出力:
IBM 50 91.50
- 現代の 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
- 実験が終了したら、Python の対話モードを終了しましょう。
exit()関数を使用することでこれを行うことができます。
exit()
各 Stock オブジェクトは独自の属性セットを保持しており、これはオブジェクト指向プログラミングにおけるクラスインスタンスの動作を示しています。これにより、同じメソッドを共有しながら、それぞれ異なる値を持つ複数の株式オブジェクトを作成することができます。
株式クラスの機能拡張
Python において、クラスはデータと振る舞いを整理する強力な手段です。関連するデータと関数をまとめることができます。このセクションでは、フォーマットされた株式情報を表示するメソッドを追加することで、Stock クラスを拡張します。これは、データと振る舞いの両方をクラスにカプセル化できる素晴らしい例です。カプセル化とは、データとそのデータを操作するメソッドをまとめることで、コードを整理し、管理しやすくすることを意味します。
まず、WebIDE のエディタで
stock.pyファイルを開く必要があります。stock.pyファイルは、Stockクラスを開発してきた場所です。エディタで開くことで、クラス定義に変更を加えることができます。次に、
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 - 文字列を使用して、株式の名前、株数、価格、総コストを含む株式情報をフォーマットして出力します。
これらの変更を加えた後、ファイルを保存する必要があります。キーボードで
Ctrl+Sを押すか、エディタの保存アイコンをクリックすることで保存できます。ファイルを保存することで、変更が保存され、後で使用できるようになります。次に、新しい Python の対話セッションを開始します。対話セッションを使うと、すぐにコードをテストすることができます。セッションを開始するには、ターミナルで以下のコマンドを実行します。
python3 -i stock.py
-i オプションは、Python に stock.py ファイルを実行した後に対話セッションを開始するよう指示します。これにより、すぐに Stock クラスとそのメソッドを使用することができます。
- では、株式オブジェクトを作成し、新しい
display()メソッドを使用してみましょう。Apple の株式を表すオブジェクトを作成し、displayメソッドを呼び出して、フォーマットされた情報を確認します。以下がコードです。
apple = Stock('AAPL', 200, 154.50)
apple.display()
このコードを対話セッションで実行すると、以下の出力が表示されます。
Stock: AAPL, Shares: 200, Price: $154.50, Total Cost: $30900.00
この出力は、display メソッドが正しく動作し、株式情報を期待通りにフォーマットしていることを示しています。
- 最後に、株式のリストを作成し、すべての株式情報を表示しましょう。これにより、複数の株式オブジェクトで
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 クラスにデータ検証、株数や価格を更新するメソッド、利益または損失を計算するメソッドなどの機能を追加することを検討してみてください。