-4

こんにちは私は「ネイトはクラスにいます」と言うデフォルトの呼び出しを取得しようとしています

開発者がデフォルト値を再度設定する必要がないように、クラスのメソッドをデフォルト値でラップできるようにしたいと思います。

しかし、次のコードは私にエラーを与えます:

Traceback (most recent call last):
File "", line 18, in 
File "", line 9, in rtn
UnboundLocalError: local variable 'var1' referenced before assignment    

私は今約1時間試していますが、これを機能させることができないようです。

コードは次のとおりです。

class Bob(object):

    def bob(self,var1='bob',var2=' is in the class'):
    print var1,var2


def defalter(func):
    def rtn(self=None,*args, **kwargs):
        if not var1:
            var1 = 'nate'  
    return rtn


b = Bob()

r = defalter(b.bob) 
r()
4

2 に答える 2

1

これは悪い考えのように思えますが、次のように動作します。

class Bob(object):

    def bob(self,var1='bob',var2=' is in the class'):
        print var1,var2


def defalter(func):
    func.im_func.func_defaults = ('nate',) + func.im_func.func_defaults[1:]
    return func


b = Bob()

r = defalter(b.bob) 
r()

属性名が python3.x で変更されていることは確かですが、現在、属性名が何に変更されたかを調べるほどの動機はありません ;-)。ご存知の方は編集よろしくお願いします。

Bobこれにより、 だけでなく、すべての の関数が変更されることに注意してくださいb。あなたがそれを望んでいるかどうかは不明です...

すべてのインスタンスで変更したくない場合はBob、次を使用できます。

def defalter(func):
    def new_func(var1='nate',**kwargs):
        return func(var1=var1,**kwargs)

    return new_func
于 2013-03-18T19:50:26.603 に答える