在下面的代码中,我为类Class
方法创建了一个装饰器。我注意到,即使没有创建类实例,也会调用这个decorator!
而不是在类中调用这些方法!你知道吗
有什么解释吗?你知道吗
def deco(class_name):
def inner_function(method):
print("method is = {} and class is: {}".format(method.__name__,class_name.__name__))
return method
return inner_function
class class_deco :
def __init__(self):
pass
class Class :
def __init__(self):
pass
@deco(class_deco)
def f1(self):
pass
@deco(class_deco)
def f2(self):
pass
当我运行脚本时:
if __name__ == "__main__":
pass
我得到这个结果:
method is = f1 and class is: class_deco
method is = f2 and class is: class_deco
如前所述,
@decorator
语法只是语法糖分,因此:严格等同于
在您的例子中,您明确地调用了decorator函数:
相当于:
这就是为什么在导入时执行
inner_function
。你知道吗接受额外参数的decorator需要更高级别的嵌套,因此从技术上讲,您的decorator应该如下所示:
但是如果关键是获取方法真正属于的类的名称,这仍然是错误的-您应该从调用该方法的实例获取类,不要试图在decorator调用中硬编码它(这永远不会像预期的那样工作,因为当您将decorator应用到函数时,真正的类不存在)。所以正确的实现应该是这样的:
注意:这当然不会处理classmethods和staticmethods。你知道吗
下面是一个演示,展示了构建装饰器的两种可能方法:
输出:
装饰剂只是以下方面的合成糖
与-
因此,该代码在导入模块后立即运行,就像任何其他名称声明一样,并且
f1
名称被替换为修饰的f1,如上所述。你知道吗相关问题 更多 >
编程相关推荐