クラスとは

 データ型の説明の中でフライングをして、オブジェクト指向の話を触りを説明しましたが、今回オブジェクト指向に必要な概念のクラスというものを説明したいと思います。
 オブジェクト指向について難しく話している記述は一杯あります。専門家ではないので正確に書くことはできないかも知れませんが、私がこんなもんかなあと感じていることから話したいと思います。

 そもそもなぜオブジェクト指向か

命令文書から台本へ
 今まで説明してきたことは、私が初めてパソコンを触ったときに、パソコンというものはこういうものかと感じた小学2年生の頃のイメージで話しています。小さい頃持ったイメージはこうです。

 世の中にはモーターやテレビ、冷蔵庫とかいろんな電化製品があります。それを使うのは人間です。 パソコンもDVDプレーヤーや液晶ディスプレイやハードディスク、プリンターなんかをもっています。その時感じたのは、これらを直接操作するのはパソコンです。そのパソコンを使うのが人間なんですが、人間は直接あれこれパソコンを使うことができません。なので代理人として登場するのがIron Pythonです。

 今まで説明したことは、Iron Pythonとコミュニケーションをとるために、Iron Pythonがわかる言葉の勉強ということになります。スクリプトファイルはIron Pythonに要求する命令文書です。小学生の頃は命令文書なんて硬くるしい言葉は知らなかったんで、注文書みたいに思っていました。自分とパソコンの間にIron Pythonがいて、注文書に沿って動いてくれるけど、間違えておかしな注文をすると動いてくれません。
 そんな文章の書き方は正に1対1。Iron Python一人に対して注文を出すイメージです。でもそういう文章ってなかなか世の中にないですね。それはあまりにも不自然だからです。そういう文章の書き方から脱却したのが、オブジェクト指向だと思っています。


 文章として一番最初思いつくのが、小説ではないでしょうか。例としてグリム童話の『ブレーメンの音楽隊』を出してみましょう。

ブレーメンの音楽隊に一説に、
 ニワトリが「コケコッコー」と鳴きました。
 ネコが「ニャーニャー」と鳴きました。
 イヌが「ワンワン」と鳴きました。
 ロバが「ヒヒーンヒヒーン」と鳴きました。
という場面があります。

これを今までの書き方で例えると
 鳴く("ニワトリ", "コケコッコー")
 鳴く("ネコ", "ニャーニャー")
 鳴く("イヌ", "ワンワン")
 鳴く("ロバ", "ヒヒーンヒヒーン")
になります。こんな文書日頃使わないですね。実に機械的です。

 ではオブジェクト指向はというと、まずこの場面を説明したときにに"鳴く"という動詞がすぐ出てくる人はまずいないでしょう。「ニワトリと、ネコと、イヌと、ロバが鳴いています。」と何が鳴いているかまず主語を言います。つまり会話において動作よりもまず"何が"という情報が重要です。鳴き声のことも書いていません。でもなんとなく鳴き声を想像できませんか。そうです"何が"という情報だけで、ある程度情報に制限を掛けることができるんです。このように"何が"という情報(オブジェクト)を重要視してプログラムを組むことを、オブジェクト指向と言います。

 つまり、ニワトリの鳴き声、ネコの鳴き声、イヌの鳴き声、ロバの鳴き声と事前に設定しておいて、使うときに

 ニワトリ.鳴く
 ネコ.鳴く
 イヌ.鳴く
 ロバ.鳴く
と書きます。

 これらの動物を学芸会の役に例えたら、スクリプトファイルはまるで、台本です。

このようにオブジェクト指向を取り入れることによって、今まで命令文書で考えたものが台本へ進化します。これよりサイズの大きなスクリプトで複雑なプログラムが組めることになります。

クラスとは
 クラスとはニワトリ、ネコ、イヌ、ロバの役を表すオブジェクトになります。
詳しいことは、次で説明することにして、今回のことをスクリプトで書いてみました。

# coding: shift-jis

class Animal:
  def __init__(self, name, nakigoe):
    self.name = name
    self.nakigoe = nakigoe

  def naku(self):
    print self.name + "が「" + self.nakigoe + "」と鳴きました。"

# 役どころを設定します。
chicken = Animal("ニワトリ","コケコッコー")
cat = Animal("ネコ","ニャーニャー")
dog = Animal("イヌ","ワンワン")
donkey = Animal("ロバ","ヒヒーンヒヒーン")

# 台本部分です。
chicken.naku()
cat.naku()
dog.naku()
donkey.naku()

raw_input()

出力画面:
 ニワトリが「コケコッコー」と鳴きました。
 ネコが「ニャーニャー」と鳴きました。
 イヌが「ワンワン」と鳴きました。
 ロバが「ヒヒーンヒヒーン」と鳴きました。