第一个装饰器的代码:
registry = []
def register(func):
def __init__(self):
print("INIT!!!")
print('running register(%s)' % func)
registry.append(func)
return func
@register
def f1():
print('running f1()')
def main():
print('registry ->', registry)
f1()
if name =='main':
main()
上面代码的输出如下,可见装饰器的__init__方法并没有执行:
running register()
registry -> []
running f1()
第二个装饰器的代码:
class tracer(object):
def __init__(self, func):
print("tracer: init")
self.func = func
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
class C:
def __init__(self):
pass
@tracer
def f(self):
print("run f!")
print("--------------")
输出如下:
tracer: init
我的问题是,这两个装饰器为何第一个装饰器的__init__方法没有执行,而第二个装饰器的__init__方法却被执行了?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.