《11》クラスに頼らない OOP(5)〈Python 3.0 版〉
《Previous| |Next》
Python à la carte《記事一覧》
《11》クラスに頼らない OOP(5)
《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28
関連記事
- C言語で始める OOP, 1988, 1994.
- 実録《14》クラス(0)要求仕様《Python3.1》 - 続・ひよ子のきもち〈Python 3.0 版〉
何が問題か:情報(データ)の共有
異なるインスタンスオブジェクトが「データ」を共有するときに、どのような問題を生じるでしょうか。
def ex3a(): stack1 = Stack() stack1.name = "stack1" # dispensable stack2 = Stack() stack2.name = "stack2" # dispensable stack1.items = stack2.items = [] # on purpose ... (=.=) for e1,e2 in zip(range(3),"ABC"): stack1.push(e1) ;print(stack1.name,stack1) stack2.push(e2) ;print(stack2.name,stack2)
異なるオブジェクトに(インスタンス属性 .items を介して)データを共有させます。すると、次のように、
>>> ex3a()
stack1 [0]
stack2 [0, 'A']
stack1 [0, 'A', 1]
stack2 [0, 'A', 1, 'B']
stack1 [0, 'A', 1, 'B', 2]
stack2 [0, 'A', 1, 'B', 2, 'C']
stack1/stack2 に同じ操作 push を適用すると、要素が混在するのが分かります。このように、同じデータを共有させるのは(スタックなど、その順序に意味がある場合に限らず)問題があります。実際に、
>>> id(stack1),id(stack1.items),stack1.push (1072176, 1050584,at 0xff270>) >>> id(stack2),id(stack2.items),stack2.push (1072304, 1050584, at 0xfff18>)
異なるインスタンス属性 stack1.items/stack2.items が、同じデータ 1050584 を共有しているのが分かります。
何が問題か:操作(アルゴリズム)の共有
異なるインスタンスオブジェクトが「アルゴリズム」を共有するときに、どのような問題を生じるでしょうか。
def ex_stack3b(): stack1 = Stack() stack1.name = "stack1" # dispensable stack2 = Stack() stack2.name = "stack2" # dispensable stack1.push = stack2.push = push # on purpose ... (=.=) for e1,e2 in zip(range(3),"ABC"): stack1.push(stack1,e1) ;print(stack1.name,stack1) stack2.push(stack2,e2) ;print(stack2.name,stack2)
異なるオブジェクトに(インスタンス属性 .push を介して)アルゴリズムを共有させます。すると、次のように、
>>> ex3b()
stack1 [0]
stack2 ['A']
stack1 [0, 1]
stack2 ['A', 'B']
stack1 [0, 1, 2]
stack2 ['A', 'B', 'C']
stack1/stack2 に同じ操作 push を適用しても、要素は混在しないのが分かります。このように、同じアルゴリズムを共有させても問題はありません。実際に、
(6507856, 1050704, <function push at 0xffae0>)(6507984, 1051984, <function push at 0xffae0>)異なるインスタンス属性 stack1.push/stack2.push が、同じ操作 0xffae0 を共有しているのが分かります。現実と実現の狭間で…
現実の世界では、各オブジェクトは「自分だけの情報(データ)と操作(アルゴリズム)を保持する実在」と見なします。自分の財布の中身(データ)を他人の知識(アルゴリズム)に頼らずに、出し入れできるのと同じ理屈です。ところが「現実」の世界観を、そのまま計算機の環境下で「実現」しようとすると、問題が生じます。なぜなら、ハードウェアをいくら増設しても、とても賄いきれないからです。 そこで、共有してもかまわないもの(むしろ再利用の恩恵が期待できる場面で)は、その資源を節約する術が必要になります。共有できない情報(データ)は各オブジェクトが保有して、共有できる操作(アルゴリズム)を他のオブジェクトとともに再利用します。それが、計算機を利用して問題解決(what)を図るときの「現実的な」実現手段(how)になります。そこで、注目したいのが「クラス」の存在意義です。Tips
各オブジェクトが同じ操作(のコピー)を個別に保持するのは、資源を浪費するだけではありません。一度、その操作を拡張/変更したいときには、そのコピーと同数のメンテナンスが必要になります。そこで、一元管理するとともに、これを再利用するのが得策です。Last updated♪09/03/26