Nokiaに関係ある事ない事をつらつらと。
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
705NKでプログラミング その12
今更取り立てて言うことでは無いのですが、Pythonはオブジェクト指向なプログラム言語です。でもこれまでは、ごく普通のスクリプトを書いてきました。と言うのも、実はオブジェクト指向なスクリプトが書けなかったからです。今までC++やPHPでオブジェクト指向のプログラムに何度と無く挑戦してきたのですが、実際にその理屈は全く理解できなかったため、早々に挫折していました。ただ、また一からプログラミングの勉強を始めてますので、この機会に今度こそオブジェクト指向なプログラミング手法への理解を深めておこうと考えています。ところで、「Pythonプログラミング入門」は初心者がPythonを学ぶことには非常に適しているのですが、若干オブジェクト指向についての説明が少ない感じがします。少なくとも、この本を読んだだけでは、オブジェクト指向プログラミングを根本的に理解するまでには至らないと思います。そこで、オブジェクト指向な考え方を学ぶために、下の参考書を1冊追加しました。元々Python向けに書かれたものではないのですが、どのようにしたら頭の中をオブジェクト指向な考え方に切り替えることができるのかを丁寧に解説しているので、「Pythonプログラミング入門」と併せてこちらも読んでみたいと思います。

オブジェクト脳のつくり方―Java・UML・EJBをマスターするための究極の基礎講座オブジェクト脳のつくり方―Java・UML・EJBをマスターするための究極の基礎講座
(2003/07/02)
牛尾 剛、長瀬 嘉秀 他

商品詳細を見る

それはさておき、Pythonで実際にオブジェクト指向なスクリプトを書いてみることにします。で、特に作りたいスクリプトも思い当たらなかったので、というか思い当たるスクリプトは自らの力量を遥かに超える超大作なので(笑)、ここは「オブジェクト脳のつくり方」の演習をPythonで書いてみたいと思います。んで、選んだ演習がP.33の

与えられた基本給から社員の給料を計算する。
計算ルール
担当:基本給が給料
主任:基本給*2+1が給料
部長:基本給*3が給料

というモノです。で、出来上がったスクリプトがこんな感じです。

import appuifw

class Employee:
   def GetSalary(self, bese):
       raise NotImplementedError

class Worker(Employee):
   rank = unicode("担当","utf-8")
   def GetSalary(self, base):
       self.salary = base
       return Worker.rank, self.salary

class Superviser(Employee):
   rank = unicode("主任","utf-8")
   def GetSalary(self, base):
       self.salary = base * 2 + 1
       return Superviser.rank, self.salary

class Chief(Employee):
   rank = unicode("部長","utf-8")
   def GetSalary(self, base):
       self.salary = base * 3
       return Chief.rank, self.salary

class Master:
   def SalaryCalc(self):
       self.choices = [unicode("担当","utf-8"),
                       unicode("主任","utf-8"),
                       unicode("部長","utf-8")]
       self.option = appuifw.popup_menu(self.choices,unicode("社員区分","utf-8"))
       self.base = appuifw.query(unicode("基本給","utf-8"), "number")
       if self.option == 0:
          self.employee = Worker()
       elif self.option == 1:
          self.employee = Superviser()
       else:
          self.employee = Chief()
       self.rank, self.salary = self.employee.GetSalary(self.base)
       appuifw.query(self.rank + unicode("の","utf-8") + "n" + unicode("基本給は","utf-8") + str(self.base) + unicode("万円","utf-8") + "n" + unicode("給料は","utf-8") + str(self.salary) + unicode("万円","utf-8")+ "n" + unicode("です","utf-8"), "query")

if __name__ == "__main__":
   do = Master()
   do.SalaryCalc()

今までのスクリプトと比較すると、class定義などを使っているので、だいぶオブジェクト指向っぽく見えるのではないかと(笑)。「オブジェクト脳のつくり方」では、Javaでの記述を前提としているので、ソースコードはかなり異なるのですが、まずクラスという設計図を作り、そこからインスタンスというオブジェクトを生成し、オブジェクトに仕事をさせる、という基本的な考え方は同じです。

## 自分への備忘録
細かいことを言えば、Javaとの相違点として、「Pythonにはインターフェースとポリモーフィズムの概念が無い」ということが挙げられます。もっと正確に言うと、無いのではなく、無意識の内に使っている、ということでしょうか。これについて書き始めると、非常に長くなりそうなのでかいつまんで説明すると、「Pythonは動的に変数の型を決定するので、特にインターフェースとポリモーフィズムを意識しなくとも同じことができる」ということになります。ただ、インターフェースと同様のことは、「クラスの継承」を使えば擬似的に再現できますし、サブクラスにどんなメソッドを実装させるか、というスクリプトの見通しを良くさせることに役立てることができそうです。こうしてみると、Javaはより論理的なプログラミング言語に感じますし、Pythonはより使いやすさを追求した言語であると感じます。
## 備忘録終わり


…何のこっちゃさっぱり分からないかもしれせんが、まぁ、プログラミングド素人のたわ言と聞き流していただければ幸いです(笑)。ともかく、大切なことは、Pythonでクラスを定義するためには、

class クラス名:
  クラス変数定義
  def メソッド名:
      メソッド定義
          .
          .
          .

という形になるということです。詳しい記述作法は「Pythonプログラミング入門」を参考にすれば良く分かると思います。で、クラスはあくまでも「設計図」という位置づけで、これ自体が仕事をすることができません。このクラスを活用するためには、インスタンスという実体を生成することになります。これは特に難しくなく、適当な変数にクラスを代入してやるだけで、インスタンスを生成することができます。例えば

abc = クラス名()

とすれば、以降はabcがインスタンスとなり、クラスの全ての機能を利用することができるようになります。実際には、

abc.メソッド名()

という形でそのクラスのメソッドを呼び出します。メソッドというのは、ぶっちゃけ「クラス内のみで使えるファンクション」で、今まで何気なく書いていたファンクションと全く変わりません。ファンクションとの違いは、メソッドを呼び出すには、まずクラスのインスタンスを生成した上で、メソッドを呼び出さなければならない、ということだけです。

まぁ、能書きはこのくらいにして、実機ではどんな感じになるのでしょうか。

nokimani071116_001.jpg

まずどの社員の給料を計算するか選択します。今回は主任を選びます。

nokimani071116_002.jpg

基本給を入力します。

nokimani071116_003.jpg

結果が表示されました。

当然のことですが、別にオブジェクト指向でスクリプトを書こうと書くまいと、実行結果は同じものを得ることができます。ただ、オブジェクト指向プログラミングを習得することで、より少ない労力でプログラム開発ができることができそうです。
スポンサーサイト

テーマ:Nokia - ジャンル:携帯電話・PHS

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。