2012年2月22日水曜日

開発環境

『初めてのPython 第3版』(Mark Lutz 著、夏目 大 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-393-7)のVI部(クラスとオブジェクト指向プログラミング)のまとめ演習の練習問題1(継承)を解いてみる。

1.

コード(TextWrangler)

#!/usr/bin/env python
#encoding: utf-8

class Adder:
 def add(self, x, y):
  print "Not Implemented"

class ListAdder(Adder):
 def add(self,l,m):
  return l+m

class DictAdder(Adder):
 def add(self,d1,d2):
  d1.update(d2)
  return d1

入出力結果(Terminal)

$ python
Python 2.7.2 (default, Feb 12 2012, 23:50:38) 
[GCC 4.2.1 Compatible Apple Clang 3.0 (tags/Apple/clang-211.12)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from python_program import*
>>> a=Adder()
>>> b=ListAdder()
>>> c=DictAdder()
>>> a.add(1,2)
Not Implemented
>>> print b.add([1,2],[3,4,5])
[1, 2, 3, 4, 5]
>>> print c.add({'a':1,'b':2},{'c':3,'d':4,'e':5})
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
>>> ^D
$

改造

コード(TextWrangler)

#!/usr/bin/env python
#encoding: utf-8

class Adder:
 def __init__(self, data):
  self.data = data
 def __add__(self, other):
  return self.add(other)
 def add(self, other):
  print "Not Implemented"

class ListAdder(Adder):
 def add(self,other):
  return self.data + other

class DictAdder(Adder):
 def add(self,other):
  other.update(self.data)
  return other

入出力結果(Terminal)

$ python
Python 2.7.2 (default, Feb 12 2012, 23:50:38) 
[GCC 4.2.1 Compatible Apple Clang 3.0 (tags/Apple/clang-211.12)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from python_program import *
>>> a=Adder(1)
>>> b=ListAdder([1,2])
>>> c=DictAdder({'a':1,'b':2})
>>> a+2
Not Implemented
>>> print b+[3,4,5]
[1, 2, 3, 4, 5]
>>> print c+{'c':3,'d':4,'e':5}
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
>>> ^D
$

addメソッドの中でインスタンス属性に保持された値と、引数として渡された値との連結を行う方法は、引数を2つにする方法よりクラスをより「オブジェクト指向的」にできる方法と言える。

0 コメント:

コメントを投稿