python:语法糖和装饰器
Posted Tester-LH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python:语法糖和装饰器相关的知识,希望对你有一定的参考价值。
python的语法糖就是对指定的目标函数进行装饰。
要想先了解装饰器,就必须先知道闭包
python函数的闭包实际上就是一个函数,其传入的参数是一个函数,返回的仍然是一个函数
例如:
import time
def after_add(func):
def add_thing():
print(\'----装饰前------\')
func()
print(\'----装饰后------\')
return add_thing
def add_1():
print((time.strftime(\'%H:%M:%S\',time.localtime(time.time()))))
if __name__== \'__main__\':
add_2 = after_add(add_1)
add_2()
这里after_add就形成了一个闭包
那如何形成一个装饰器?装饰器其实跟闭包相似,只是装饰器没有将新函数传给一个变量,然后再调入,而是一气呵成
装饰器相当于 add_2 = after_add(add_1)
所以代码可以等价于
import time
def after_add(func):
def add_thing():
print(\'----装饰前------\')
func()
print(\'----装饰后------\')
return add_thing
@after_add
def add_1():
print((time.strftime(\'%H:%M:%S\',time.localtime(time.time()))))
if __name__== \'__main__\':
add_1()
这里就跟前面的闭包一样,就跟 add_2 = after_add(add_1)这样分析,先进入after_add(),先定义了函数,然后再得到新函数,接着再调用得到的函数,所以最后才打印这个结果
如果像这样
import time
def after_add(func):
print(11)
def add_thing():
print(\'----装饰前------\')
func()
print(\'----装饰后------\')
return add_thing
@after_add
def add_1():
print((time.strftime(\'%H:%M:%S\',time.localtime(time.time()))))
if __name__== \'__main__\':
add_1()
加入print(11),所以先打印了11
记住两个原则:
1、装饰器在函数调用之前被增强
2、相同的函数只被增强一次
下面看一下带参数的装饰器
目标函数的参数供自己使用,就例如
import time
def say_thing(func):
def say_say(name):
print("Hello")
func(name)
return say_say
@say_thing
def say_name(name):
print(name)
say_name(\'Li Ming\')
这里注意say_say这里也需要带参数,因为装饰器最后调用的是增强后的say_say,需要通过增强函数将参数传给目标函数.
这里还注意一点就是如果有多个装饰器,它是从内往外增强的
以上是关于python:语法糖和装饰器的主要内容,如果未能解决你的问题,请参考以下文章