2008年6月6日金曜日

今日の懺悔

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
pythonで

class Hoge(object):
def foo(self):
self.piyo = 1

ができないと思っていた。__init__の中だけだと思っていたが違う。


In [1]: class Hoge(object):
...: def foo(self):
...: self.piyo = 1
...:

In [2]: h = Hoge()

In [3]: h.piyo
---------------------------------------------------------------------------
exceptions.AttributeError Traceback (most recent call last)
/home/nori/Desktop/work/wxpygammon/src/

AttributeError: 'Hoge' object has no attribute 'piyo'

In [4]: h.foo()

In [5]: h.piyo
Out[5]: 1


まあ、必然的な理由がない限りやらないほうが、混乱を避けられるから好ましいだろうが。

メソッド内と外部からでは__dict__へのアクセスレベルが違うということだろう。
外からでは__dict__に対してkey Errorになるようなupdateをかけられない。
また、メソッド内での代入typoには注意したほうがいいですね。

7.6 クラス定義

プログラマのための注釈: クラス定義内で定義された変数はクラス変数です; クラス変数は全てのインスタンス間で共有されます。インスタンス変数を定義するには、__init__() メソッドや他のメソッド中で変数に値を与えます。クラス変数もインスタンス変数も ``self.name'' 表記でアクセスすることができます。この表記でアクセスする場合、インスタンス変数は同名のクラス変数を隠蔽します。変更不能な値をもつクラス変数は、インスタンス変数のデフォルト値として使えます。新形式のクラスでは、デスクリプタを使ってインスタンス変数の振舞いを変更できます。

0 件のコメント: