続・pythonでクラスの中でのデフォルト引数に嵌った

class Test2():
    alt = "fuga"
    def p(self, arg = alt):
        print arg

t = Test2()
t.p("hoge")    # >>> hoge
t.p()          # >>> fuga
t.alt = "piyo"
t.p()          # >>> fuga

あー、この方法だとデフォルト値の変更が効かないからダメだ(デフォルト値は関数定義の時にだけ評価される)。


さらに調べてみたところ、このようにするのがいまのところ一番良いみたい。

class Test3():
    alt = "fuga"
    def p(self, arg = None):
        if arg is None:
            arg = self.alt
        print arg

t = Test3()
t.p("hoge")    # >>> hoge
t.p()          # >>> fuga
t.alt = "piyo"
t.p()          # >>> piyo

これはちょっと面倒だなぁ。