Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

間違いやすいPythonのクラス変数とインスタンス変数

すごい昔のエントリですが、コメントできなくなってたんでTBで。

やっぱり、インスタンス変数(クラス変数も!)は先頭で宣言しないと気持ち悪い。だから、初期化の必要がなくても以下のように書いておく。

class Hoge:
  #名前
  name = None

  def __init__(self, name):
    self.name = name

Pythonのインスタンス変数

気持ちはとてもとてもよくわかるんですけど、class宣言の中に変数を置いてもそれはあくまでもclassオブジェクトに紐づく値となってしまい、インスタンスの変数とはなりません。もちろん、わかってて使うなら大丈夫ですけど。

>>> class Hoge(object):
...     foo = 10
>>> hoge1 = Hoge()
>>> Hoge.__dict__.items()
[('__dict__', <attribute '__dict__' of 'Hoge' objects>), ('__module__', '__main__'), ('foo', 10), ('__weakref__', <attribute '__weakref__' of 'Hoge' objects>), ('__doc__', None)]
# ↑ここにfooはあるけど・・・
>>> hoge1.__dict__
{}
# ↑hoge1はfooを持ってない

ドキュメントにも言及されてて、デフォルト値として使ってもいいけどミュータブルな値を使うと予期しない結果になると書かれてます。

Variables defined in the class definition are class variables; they are shared by all instances.
To create instance variables, they can be set in a method with self.name = value.

...中略...

Class variables can be used as defaults for instance variables, but using mutable values there can lead to unexpected results.

7.7. Class definitions