さて、Pythonを勉強して30時間ぐらい経過してなんとなく全体像が見えてきた。そして、おそらくプログラミング学習者にとって最初の難関であろうクラスについて、概念をつかむことができた。ちなみに僕はPythonは初めてだし、プログラミングもこれが初めてだ。そんな僕がなぜこんな記事を書こうと思ったかというと、学習によりレベルが上がってくると、初心者がどこでわからなくなるのかが、わからなくなってしまうからだ。
クラスとは
クラスとはある物体を作成する「ひな形」である。オレンジを作成することを考えてみよう。オレンジを作成するには、皮の色、へたの色、そして重さを決める必要がある。この決めないといけない項目をまとめたものがクラスである。これらの項目は属性と呼ばれる。
インスタンスとは
インスタンスとはひな型(クラス)の属性に値をいれて生成した成果物のこと。皮の色は「濃いオレンジ」に、へたの色は「濃い緑」に、それから重さは「250g」にセットして、ポンとボタンを押したら「インスタンス生成されました!」と例えばこんなオレンジができる。
一度、ひな型(クラス)を作っておけば、属性値を設定して、ボタンを押すだけで、ポンポンポンと簡単にいろんなインスタンスができるわけだ。
これをPythonのコードで書いてみる
これをpythonのコードで書くと次のようになる。クラスの中には実際に処理をするための関数を記載する。関数を定義する場合、先頭に def を書いて関数であることを宣言する。クラスの中で定義する関数のことをメソッドと呼ぶ。( )の中はメソッドを利用するに必要な引数だ。
#クラスの定義
class Orange:
def __init__(self, n, p, s, w):
self.name = n #名前
self.peel = p #皮の色
self.stem = s #へたの色
self.weight = w #重さ
print("インスタンス " + self.name + " が作成されました!")
print("・皮の色:" + self.peel)
print("・へたの色:" + self.stem)
print("・重さ:" + str(self.weight) + "g")
print("") #1行あける
#インスタンスの作成
orange1 = Orange('オレンジ1', '濃いオレンジ', '濃い緑', 250)
orange2 = Orange('オレンジ2', '濃いオレンジ', '濃い緑', 200)
orange3 = Orange('オレンジ3', '明るいオレンジ', '薄い緑', 300)
クラスからインスタンスを作成する場合は、インスタンス名 = クラス名( ) の書式で書く。上記の例ではオレンジ1、オレンジ2、オレンジ3の3つのインスタンスを作成している。インスタンスの作成時の()中は、引数で、インスタンスを作成したタイミングでクラスの init メソッドに渡される。Orange 1の場合だと次のようなイメージだ。
「self」という引数はこれはインスタンス自身を指す。ここでは、orange1 というインスタンスを作成しているので、self には、インスタンスであるorange1 が引数として引き渡される。このように最初の引数には、インスタンス自身が引き渡されるので、カッコの中で指定する必要があるのは2番目の引数以降である。
例えば以下の部分のselfはインスタンス自身を指しているので、orange1 インスタンスのname というプロパティに n で受け取った引数を設定すると読むことができる。
self.name = n
すなわち以下のように設定される。
orange1.name = 'オレンジ1'
上記のコードをファイルに保存して実行すると下のような結果になる。
PS C:\python> python3 .\orange.py
インスタンス オレンジ1 が作成されました!
・皮の色:濃いオレンジ
・へたの色:濃い緑
・重さ:250g
インスタンス オレンジ2 が作成されました!
・皮の色:濃いオレンジ
・へたの色:濃い緑
・重さ:200g
インスタンス オレンジ3 が作成されました!
・皮の色:明るいオレンジ
・へたの色:薄い緑
・重さ:300g
PS C:\pytho>
インスタンスを作成したと同時に、「__init__( )メソッド」が実行されたのに注目していただきたい。これまで混乱しないように説明しなかったが、実は「__init__( )メソッド」はインスタンスが作成されたと同時に実行される特別なメソッドなのだ。最初に「init( )メソッド」で処理を実行することを、「初期化する」といったりする。、またこの初期化メソッドのことをコストラクタと呼ぶ。
このコードをイメージにするとこんな感じ。
クラスにメソッドを追加してみる
前述したとおり、初期化するメソッドしか書いてなかったので普通のメソッドを追加してみたいと思う。オレンジの値段を1g 2円で計算する calc メソッドを追加してみよう。
#クラスの定義
class Orange:
def __init__(self, n, p, s, w):
'''初期化処理'''
self.name = n #名前
self.peel = p #皮の色
self.stem = s #へたの色
self.weight = w #重さ
print("インスタンス " + self.name + " が作成されました!")
print("・皮の色:" + self.peel)
print("・へたの色:" + self.stem)
print("・重さ:" + str(self.weight) + "g")
print("") #1行あける
def calc(self):
'''オレンジの値段を計算する(1g 2円)'''
price = self.weight * 2
return price
#インスタンスの作成
orange1 = Orange('オレンジ1', '濃いオレンジ', '濃い緑', 250)
#値段の計算
v = orange1.calc()
print("お値段は "+ str(v) + "円")
「init( )メソッド」とは異なり、初期化しただけで処理されないので、v = orange1.calc() で、orange1インスタンスのcalc() メソッドを実行し、戻り値を変数 v に代入してる。
これを実行すると次のようになる。
PS C:\python> python3 .\orange.py
インスタンス オレンジ1 が作成されました!
・皮の色:濃いオレンジ
・へたの色:濃い緑
・重さ:250g
お値段は 500円
PS C:\pytho>
オブジェクトとは
ここまでオブジェクトという用語を使わないで説明してきたが、オブジェクトとは物という意味で、クラスもインスタンスもオブジェクトである。具体的に何かを指すものではないので、以下の関係から何となく理解すればOK。
- クラスもインスタンスもオブジェクトである。
- クラスからオブジェクトをつくることができる。
- クラスから作成されたオブジェクトはインスタンスである。
参考文献
・実践力を身につける Pythonの教科書 (こっちの方が分かりやすくてお勧め)
・独学プログラマー
コメント