プロが教えるわが家の防犯対策術!

class foo( object ):
   
   __result = []
   
   def __init__( self, n, m ):
      # self.__result = []
      self.__result.append( n + m )

   def func( self ):
      print self.__result[0]

hoge = foo( 1, 2 )
fuga = foo( 3, 4 )

hoge.func() # 3
fuga.func() # 3 ... !?

数値や文字列といったメンバ変数は、コンストラクタで意図的に初期化してやらなくても正常な値になりますが、それ以外のオブジェクトや配列だと fuga は hoge のメンバと同じものになってしまいます。他の言語の感覚ですと、__result は foo のメンバな上にプライベートなので、fuga の __result が hoge.__result を指すのは考えられない事なのですが、この書き方がマズいのでしょうか。
また、もしこのようになっている理由等もありましたら、併せてお教えください。

A 回答 (1件)

> class foo( object ):


>  __result = []

クラス変数を定義してるのに、インスタンス変数と誤解しているのが敗因かと。

http://codepad.org/vwKCv0XY

参考URL:http://www.google.co.jp/search?hl=ja&q=python+%E …
    • good
    • 0
この回答へのお礼

ありがとうございます。まさに,おっしゃるとおりクラス変数/インスタンス変数という仕組みがある事を知らない事が敗因でした。また一つ勉強になりました。
# 複数のインスタンスからシームレスにアクセス可能なクラス変数の有用性を理解しつつも,変数のスコープやメンバ変数の記述性など,もっと根本的な記述性に疑問符が残りつつもありますが :D

お礼日時:2011/08/22 22:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!