インスタンス生成時には、__init__() メソッドで初期化

朝からPython、bonlifeです。以下の記事を見て、こういうことじゃないかな、と思ったことをメモ。

クラスオブジェクトの属性に対して処理してしまっているのが問題。インスタンスに共通な初期化(例えば空の辞書を定義しておく、など)は__init__()の中で行えばオーケー。(このあたり参照。)

>>> class Test(object):
	def __init__(self):
		self.d = {}

		
>>> test1 = Test()
>>> test2 = Test()
>>> test1.d['key'] = 'value1'
>>> test2.d['key'] = 'value2'
>>> test1.d['key']
'value1'
>>> test2.d['key']
'value2'
>>> 
>>> class Test2(object):
	pass

>>> test3 = Test2()
>>> test4 = Test2()
>>> test3.d = dict(key='value3')
>>> test4.d = dict(key='value4')
>>> test3.d['key']
'value3'
>>> test4.d['key']
'value4'
>>> 
>>> test1.d = 'string'
>>> test1.d['key']

Traceback (most recent call last):
  File "<pyshell#62>", line 1, in <module>
    test1.d['key']
TypeError: string indices must be integers
>>> test1.d
'string'

Test2クラスはインスタンス生成時には何もせず、後から辞書を代入するようにしてみました。__init__()での初期化の方がスマートだと思いますが、こういうことも可能だという例です。
また、データ型は代入時に動的に決められるので、一度、辞書として定義したtest1インスタンスのd属性を、test1.d = 'string' で簡単に文字型に上書きしてしまえるのもPythonの特徴。って説明は合っているのかしら(苦笑)。