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