装饰器作用类似于java中的AOP,用于处理异常日志等作用时非常好用。
1.闭包:
可以简单把闭包理解为函数中创建函数,内层函数不可以直接调用,只该内层函数的外层函数才可以调用它
def genetater_power(number):
def nth_power(power):
return number*power
return nth_power
raise_two=genetater_power(2)
print(raise_two(7))
简单装饰器中return了wrapper,加上括号后其实就相当于执行了wrapper()
def decorater(func):
def wrapper():
print("start")
func()
print("end")
return wrapper
@decorater
def mycode():
print("run")
mycode()
3.修饰带参数的函数:
最外面的参数为func,wrapper括号中的参数是函数的参数。装饰器中可以取到函数的参数,并对其进行操作。
class Picture():
def __init__(self,image_key=None,image_id=None,image_url=None):
self.image_key=image_key
self.image_id=image_id
self.image_url=image_url
pic=Picture(123,"pic_1","www.baidu.com")#生成一个对象作为参数
def generater(func):
def wrapper(*args,**kw):#
func(*args,**kw)
print(args[0].image_url)
return wrapper
@generater
def get_pic(param):
print(param)
get_pic(pic)
4.带参数的装饰器:
下面的装饰器用装饰器重复执行函数,执行的次数是装饰器的参数。
带参数的装饰器中,装饰器的参数在最外层,第二层的参数还是func,第三层是所要修饰的函数的参数。
def again(i):
def decorater(func):
def wrapper(*args,**kwargs):
for j in range(0,i):
func(*args,**kwargs)
return wrapper
return decorater
@again(3)
def do_mycode(param):
print(param)
do_mycode(pic.image_url)
装饰器作用类似于java中的AOP,用于处理异常日志等作用时非常好用。
1.闭包:
可以简单把闭包理解为函数中创建函数,内层函数不可以直接调用,只该内层函数的外层函数才可以调用它