2
class test :

    def fn(self, i):
        #test.fn.f = 0     the "compiler" show "not define" errors
        #self.fn.f = 0     the "compiler" show "not define" errors

        return test.fn.f   #ok
        return self.fn.f   #ok

    fn.f = 1

p = test()

print p.fn(1)

「fn」メソッドで属性の値を変更できない理由が気になります

本質的に、それは...

test.fn.fとの違いは何self.fn.fですか? 関数の属性値を変更しても問題ないと確信していますが、なぜメソッドでそれを行うことができるのでしょうか?

4

2 に答える 2

4

何が起こるかは次のとおりです。

fn.f = 1関数自体に属性を与えます。

ただし、 and でアクセスするtest.fnself.fn、関数自体は取得されませんが、instancemethod. なんで?クラスの属性アクセスでは、コンポーネントの__get__メソッドがあれば呼び出されるためです。関数の場合、これが当てはまります。

関数の__get__メソッドを呼び出す場合は、関数の単なるラッパーであるバインドまたは非バインド インスタンス メソッドに変換します。

あなたはそれに対処することができます

test.fn.im_func.f = 1
self.fn.im_func.f = 1
于 2012-06-01T08:45:07.673 に答える
1

に任意の属性を割り当てることはできませんinstancemethodfunction割り当ては、その時点ではまだであるため、クラス本体内で機能します。instancemethodブロックの最後にクラスが作成されるまで、それはになりません。

于 2012-06-01T08:40:21.873 に答える