日曜日, 8月 10, 2008

Pythonにおけるインスタンス変数の宣言

久々にPython。

Pythonのインスタンス変数 という記事を見つける。
ようするに、変なタイミングでインスタンス変数が作られるのは気持ち悪いから、ちゃんと宣言したいという話らしい。
でも、その対策案であるサンプルコードは何か変。
あれだと、クラス変数nameが追加されるだけで、インスタンス変数self.nameは何の変化もしていない。
インスタンス変数を宣言したいなら、__init__内でやればいいわけで、つまり対策前コードでも用件は十分満たしていると。
つまり、サンプルコードがよくないのかも。もっと正しく(?)汚らしいコードでないと、問題点も明らかにならないんじゃないかな。
というわけで、対策案が何か変なことを示す例を出してみる。

>>> class Hoge():
... name = None
... age = None
... def __init__(self, name):
... self.name = name
... def print_profile(self):
... print self.name, self.age
... def set_age(self, age):
... self.age = age
...
>>> a = Hoge("a1")
>>> a.print_profile()
a1 None
>>> print Hoge.name, Hoge.age
None None
>>> Hoge.name = "b1"
>>> Hoge.age = 20
>>> a.set_age(30)
>>> a.print_profile()
a1 30
>>> print Hoge.name, Hoge.age
b1 20
>>> a.age = 40
>>> a.print_profile()
a1 40
>>> print Hoge.name, Hoge.age
b1 20
>>>


こういう動作を期待しているとは思わないんだけど、どうなんでしょ。
コメント欄もないし、トラックバックも、はてな内ででしか出来ないみたいだから、コンタクト出来ないのが残念。

0 件のコメント: