1

クラス インスタンスのメソッドと関数が同じかどうかを確認するにはどうすればよいですか?

デコレータを使用する単純なクラスがあります。

@decorate_class
class Hello:

    @decorate_func
    def world(self):
        return

そして、これらは私のデコレータです:

# A global variable
global_func = None

def decorate_func(func):
    global_func = func
    return func

def decorate_class(clazz):
    print clazz.__dict__["world"] == global_func
    return clazz

上記は、 inがFalseであるため可能ですが、 inは です。しかし、両方を印刷すると、次のようになります。type(func)decorate_funcfunctiondecorate_classinstancemethod

<function world at 0x7f490e59ce60>

のように、同じメモリアドレス。それらを比較して、それらが同じ機能であることを知るにはどうすればよいですか? メモリ アドレスによる比較は安全 (かつ正しい) ですか?

4

1 に答える 1

3

ここでの問題は、実際には の使用ですglobal_func

次のように変更した場合decorate_class:

def decorate_class(clazz):
    print global_func, clazz.__dict__["world"] == global_func
    return clazz

global_funcであることがわかりますNone

これを修正するには、次のように明示的に宣言しglobal_funcます。globaldecorate_func

def decorate_func(func):
    global global_func
    global_func = func
    return func

そして、すべてがうまくいくでしょう。

これは (基本的に) Python が、関数内の変数に割り当てる場合、明示的にグローバルであると宣言されていない限り、その変数はその関数に対してローカルであると想定されるためです。

于 2012-06-09T15:36:00.167 に答える