美文网首页
装饰器传参

装饰器传参

作者: 水果坚果燕麦片 | 来源:发表于2019-03-12 21:29 被阅读0次
def log_time(func):  # 此函数的作用时接受被修饰的函数的引用test,然后被内部函数使用
    def make_decorater():
        print('现在开始装饰')
        func()
        print('现在结束装饰')
    return make_decorater  # log_time()被调用后,运行此函数返回make_decorater()函数的引用make_decorater
 
@log_time  # 此行代码等同于,test=log_time(test)=make_decorater
def test():
    print('我是被装饰的函数')
test()  # test()=make_decorater()

现在开始装饰
我是被装饰的函数
现在结束装饰
 
 当被装饰的函数有形参时
def log_time(func):
    def make_decorater(*args,**kwargs):  # 接受调用语句的实参,在下面传递给被装饰函数(原函数)
        print('现在开始装饰')
        test_func = func(*args,**kwargs)  # 如果在这里return,则下面的代码无法执行,所以引用并在下面返回
        print('现在结束装饰')
        return test_func  # 因为被装饰函数里有return,所以需要给调用语句(test(2))一个返回,又因为test_func = func(*args,**kwargs)已经调用了被装饰函数,这里就不用带()调用了,区别在于运行顺序的不同。
    return make_decorater
 
 
@log_time
def test(num):
    print('我是被装饰的函数')
    return num+1
 
a = test(2)  # test(2)=make_decorater(2)
print(a)

结果:
现在开始装饰
我是被装饰的函数
现在结束装饰
3

相关文章

网友评论

      本文标题:装饰器传参

      本文链接:https://www.haomeiwen.com/subject/bzuopqtx.html