1. 函数的执行与传递
当你把一对小括号放在后面,这个函数就会执行;然而如果你不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它。参考菜鸟教程。
2. 装饰器
说人话的解释:理解 Python 装饰器看这一篇就够了 代码略难懂,修改如下,不用装饰器:
def use_logging(func): def wrapper(): logging.warn("%s is running" % func.__name__) return func() # 把 foo 当做参数传递进来时,执行func()就相当于执行foo() return wrapper def foo(): print('i am foo') test = use_logging(foo) # 因为装饰器use_logging(foo)返回的是函数对象wrapper,这条语句相当于test = wrapper test()
或者在wrapper后面加()才会被执行
def use_logging(func): def wrapper(): logging.warn("%s is running" % func.__name__) return func() # 把 foo 当做参数传递进来时,执行func()就相当于执行foo() return wrapper() # 注意这里的括号 def foo(): print('i am foo') use_logging(foo)
使用装饰器的写法, 第一种:
def use_logging(func):
def wrapper():
logging.warn("%s is running" % func.__name__)
return func() # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
return wrapper
@use_logging def foo(): print('i am foo') foo()
第二种:
def use_logging(func): def wrapper(): logging.warn("%s is running" % func.__name__) return func() # 把 foo 当做参数传递进来时,执行func()就相当于执行foo() return wrapper() @use_logging def foo(): print('i am foo') foo #这里不要再加括号了!