如何判断函数和类实例方法是否相同?

时间:2012-06-09 15:24:38

标签: python metaprogramming

如何判断类实例方法和函数是否相同?

我有一个使用装饰器的简单类:

@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

以上内容返回False,因为type(func)中的decorate_funcfunction,但decorate_class中的instancemethod<function world at 0x7f490e59ce60> 。但打印它们给了我:

{{1}}

同样,内存地址相同。我如何比较它们才知道它们是相同的功能?是通过内存地址比较安全(和正确)?

1 个答案:

答案 0 :(得分:3)

这里的问题实际上是您使用global_func

如果您将decorate_class更改为:

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

您会看到global_funcNone

要解决此问题,请在global_func中明确声明globaldecorate_func

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

一切都会奏效。

这是(基本上)因为Python假定,如果你在一个函数中赋值变量,那么该变量被认为是该函数的本地变量,除非它被明确声明为全局变量。