如何判断类实例方法和函数是否相同?
我有一个使用装饰器的简单类:
@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_func
为function
,但decorate_class
中的instancemethod
为<function world at 0x7f490e59ce60>
。但打印它们给了我:
{{1}}
同样,内存地址相同。我如何比较它们才知道它们是相同的功能?是通过内存地址比较安全(和正确)?
答案 0 :(得分:3)
这里的问题实际上是您使用global_func
。
如果您将decorate_class
更改为:
def decorate_class(clazz):
print global_func, clazz.__dict__["world"] == global_func
return clazz
您会看到global_func
是None
。
要解决此问题,请在global_func
中明确声明global
为decorate_func
:
def decorate_func(func):
global global_func
global_func = func
return func
一切都会奏效。
这是(基本上)因为Python假定,如果你在一个函数中赋值变量,那么该变量被认为是该函数的本地变量,除非它被明确声明为全局变量。