python进阶

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   #这里不要再加括号了!

 

原文地址:https://www.cnblogs.com/zhengmeisong/p/13683290.html