pythonでクラスの中でのデフォルト引数に嵌った
>>> 続・pythonでクラスの中でのデフォルト引数に嵌った - 切なさの刹那
デフォルト引数の機能を使って、メソッドの呼び出しに引数が無かった時のためにデフォルトの値を指定しておく。
alt = "fuga" def test0(arg = alt): print arg test0("hoge") # >>> hoge test0() # >>> fuga
これをクラスの中で使おうとすると、こう書いた時点でエラーを吐く。p1,p2のどちらかでもダメ。
class Test1(): def __init__(self): self.alt = "fuga" def p1(self, arg = self.alt): print arg def p2(self, arg = alt): print arg
正解はこう。
class Test2(): alt = "fuga" def p(self, arg = alt): print arg t = Test2() t.p("hoge") # >>> hoge t.p() # >>> fuga
Test1の書き方だとp1,p2のメソッドを定義した段階では__init__が呼ばれていないから、変数の用意が出来てなくてデフォルト引数の指定が失敗するというわけ。
最初からクラスの中にベタ書きしておけば問題無し。
ちなみにrubyだと一つ目の方法で書く。その代わり最初の例そのままだとエラーが出るみたい(altをローカル変数以外にすればおk)。
class Test1 def initialize() @alt = "fuga" end def p1(arg = @alt) p arg end end t = Test1.new() t.p1("hoge") # => hoge t.p1() # => fuga
alt = "fuga" def test0(arg = alt) p arg end test0("hoge") # => hoge test0() # => ERROR