装饰器的本质还是一个函数,在不改变函数调用方式的情况下,对函数进行额外功能的封装
装饰一个函数,转给他加一个其他功能
函数在没调用前都是字符串,加了括号才是运行
函数即变量
def out(func):
func() #这样相当于func是个变量
def demo():
print(111)
out(demo)
#打印111,相当于demo就是那个参数
嵌套函数:
def out():
def inner():
print(111)
out()
#这样不会打印,因为没有调用inner,inner那坨相当于字符串
def out():
def inner():
print(111)
inner()
out()
#这样才打印111
def out():
name='dsx'
def inner():
name='zy'
print(name)
inner()
print(name)
out()
#打印zy
dsx
def out():
name='dsx'
def inner():
print(name)
inner()
print(name)
out()
#打印dsx
dsx
给每个函数加上运行时间:
import time
def demo():
print('我是大师兄!')
def out():
start=time.time()
demo()
end=time.time()
print(end-start)
out()
import time
def demo():
print('我是大师兄!')
def demo1():
print('我是师兄!')
def out(func):
start=time.time()
func()
end=time.time()
print(end-start)
out(demo)
out(demo1)
import time
def demo():
print('我是大师兄!')
def out(func): #这个函数返回值为inner,inner为out()函数的返回值
def inner():
start=time.time()
func()
end=time.time()
print(end-start)
return inner #返回了inner的方法,但是没有调用
demo=out(demo) #demo=inner 将inner赋值与demo
demo() #其实是运行inner()
import time
def out(func):
def inner():
start=time.time()
func()
end=time.time()
print(end-start)
return inner
@out
def demo():
print('我是大师兄!')
demo()
#demo=out(demo)相当于等于@out
import time
def out(func):
def inner(*args,**kwargs):
start=time.time()
func(*args,**kwargs)
end=time.time()
print(end-start)
return inner
@out
def demo(name):
print(name)
demo(1)
import time
def auto(type):
if type==1:
def out(func):
def inner(*args,**kwargs):
start=time.time()
func(*args,**kwargs)
end=time.time()
print(end-start)
return inner
return out
elif type==2:
pass
@auto(1) #如果装饰器加了括号,就要在外在加一层函数
def demo(name): #将demo起名为func也可以
print(name)
demo(1)