2012-06-09 27 views
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 

以上的回报False,可能是因为type(func)decorate_funcfunction,但在decorate_class它是instancemethod。但是,他们都打印给我:

<function world at 0x7f490e59ce60> 

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

+4

至少'全球global_func'在decorate_func)缺失( – jfs

+0

我愚蠢的错误,另外一个。非常感谢你,先生:) –

回答

3

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

如果更改decorate_class到:

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

你会看到global_funcNone

要解决这个问题,在decorate_func明确声明global_funcglobal

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

事情一切正常。

这是(基本上)因为Python假设,如果你分配给一个变量的函数,变量被认为是局部的作用,除非它被明确宣布为全球性的。

+0

好了,我得到了固定为J.F.塞巴斯蒂安在评论中提到它,它解决了这个问题。但是,既然你提到它作为答案,我会将它标为一个。非常感谢您的参与 :) –