2009-07-01(水)
間違いやすいPythonのクラス変数とインスタンス変数(2)
Pythonネタを書いたら、狙っていた通りckuwataさんが補足をくれたので追エントリしときます*1。ありがとうございます!
要するにこれは「class の直下で変数宣言をしたい」「でも普通にそれをやるとクラス変数になってしまう」という問題なわけだな。こういう場合にどうするかというと、プロパティを使うのが多分スマートだろう。
なるほど、確かにフィールドを直接触るよりプロパティを使うのが自然ですね。ただ、なんでもかんでもプロパティにするのかと思いきや、
ちなみに俺の方針としては、
- 外部仕様として公開するのならプロパティ
- そうでなければ __init__ 内部に列挙
というのがバランスのとれたやり方かなと思ってる。
とのこと。確かに、プロパティの記法は長いのでプライベート値まで全部作ってると泣けますね。
ちなみに、シャドーイングもかなり心惹かれる手法ですが*2、デコレータマニアとしてはドキュメントに出ていた、
class C(object): def __init__(self): self._x = None @property def x(self): """I'm the 'x' property.""" return self._x @x.setter def x(self, value): self._x = value @x.deleter def x(self): del self._x
が好きです。バージョン依存あるかもしれないですが。
で、クラス変数として定義すると結局何がまずいのさ?
順番おかしいですが、最後にクラス変数として定義しちゃ駄目な例をあげときます*3。listやdictはミュータブルなので、以下のようなコードは危険です。
>>> class Hoge(object): ... foo = [] ... >>> hoge1 = Hoge() >>> hoge1.foo.append("I'm hoge1.") >>> hoge2 = Hoge() >>> hoge2.foo ["I'm hoge1."]
逆にイミュータブルな値であれば、動きとしての問題はおきないし、デフォルト値を使い回すことでメモリの節約も狙えます。
トラックバック - http://d.hatena.ne.jp/hiratara/20090701/1246416953
リンク元
- 219 http://www.google.co.jp/url?sa=t&rct=j&q=python クラス変数&source=web&cd=3&ved=0CDYQFjAC&url=http://d.hatena.ne.jp/hiratara/20090701/1246416953&ei=5geETte0N-jViAK5lczDDA&usg=AFQjCNFyiueDYLUF_MifAtY03XLe0KoV
- 178 http://www.google.co.jp/search?q=python+クラス変数 インスタンス変数&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:ja:unofficial&client=firefox
- 103 http://www.google.co.jp/search?hl=ja&q=python+クラスの変数を列挙&btnG=検索&lr=lang_ja
- 96 http://www.google.co.jp/url?sa=t&rct=j&q=python+クラス+変数&source=web&cd=2&ved=0CDMQFjAB&url=http://d.hatena.ne.jp/hiratara/20090701/1246416953&ei=BfLKTvmKD4n0mAWf_tHQDQ&usg=AFQjCNFyiueDYLUF_MifAtY03XLe0KoV_
- 83 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=python+クラス 変数
- 74 http://www.google.co.jp/search?aq=f&sourceid=chrome&ie=UTF-8&q=python+クラス変数
- 58 http://www.google.co.jp/search?hl=ja&source=hp&q=Python+クラス変数&btnG=Google+検索&lr=&aq=f&oq=
- 41 http://www.google.co.jp/url?sa=t&rct=j&q=python class 紊????&source=web&cd=1&sqi=2&ved=0CCcQFjAA&url=http://d.hatena.ne.jp/hiratara/20090701/1246416953&ei=R4WfTpbEJoihiAfvzazpBg&usg=AFQjCNFyiueDYLUF_MifAtY03XLe0KoV_w
- 38 http://www.google.co.jp/url?sa=t&source=web&cd=3&ved=0CCoQFjAC&url=http://d.hatena.ne.jp/hiratara/20090701/1246416953&rct=j&q=python クラス変数&ei=kCK2TdTqIIWAvgOplem1Dw&usg=AFQjCNFyiueDYLUF_MifAtY03XLe0KoV
- 34 http://www.google.co.jp/search?q=python+インスタンス+ID&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:ja:unofficial&client=firefox





