一、装饰器
定义:本质是函数
功能:装饰其他函数
就是为其他函数添加附加功能
原则:
(1)不能修改被装饰的函数的源代码
(2)不能修改被装饰的函数的调用方式
#!/usr/bin/env python # -*- coding:utf-8 -*- import time def timmer(func): def warpper(*args,**kwargs): start_time = time.time() func() stop_time = time.time() print('the func run time is %s' %(stop_time-start_time)) return warpper @timmer def test1(): time.sleep(3) print('in the test1')
实现装饰器知识储备:
(1)函数即“变量”
#!/usr/bin/env python # -*- coding:utf-8 -*- def foo(): print('in the foo') bar() foo() def bar(): print('in the bar') def foo(): print('in the foo') bar() foo() def foo(): print('in the foo') bar() def bar(): print('in the bar') foo() def foo(): print('in the foo') bar() foo() def bar(): print('in the bar')
(2)高阶函数
a:把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码的情况下为其添加功能)
#!/usr/bin/env python # -*- coding:utf-8 -*- import time def bar(): time.sleep(3) print('in the bar') def test1(func): start_time = time.time() func() #run bar stop_time = time.time() print("the func run time is %s" %(stop_time-start_time)) test1(bar)
b:返回值中包含函数名(不修改函数的调用方式)
#!/usr/bin/env python # -*- coding:utf-8 -*- import time def bar(): time.sleep(3) print('in the bar') def test2(func): print(func) return func # print(test2(bar)) bar = test2(bar) bar()
(3)嵌套函数
#!/usr/bin/env python # -*- coding:utf-8 -*- def foo(): print('in the foo') def bar(): print('in the bar') bar() foo()
高阶函数+嵌套函数=》装饰器
#!/usr/bin/env python # -*- coding:utf-8 -*- import time def timer(func): #timer(test1) func=test1 def deco(): start_time = time.time() func() stop_time = time.time() print('the func run time is %s' %(stop_time-start_time)) return deco @timer #test1 = timer(test1) def test1(): time.sleep(3) print('in the test1') @timer def test2(): time.sleep(3) print('in the test2') # test1 = timer(test1) # test1() #-->deco test1() test2()
#!/usr/bin/env python # -*- coding:utf-8 -*- import time def timer(func): #timer(test1) func=test1 def deco(*args,**kwargs): start_time = time.time() func(*args,**kwargs) stop_time = time.time() print('the func run time is %s' %(stop_time-start_time)) return deco @timer #test1 = timer(test1) def test1(): time.sleep(1) print('in the test1') @timer #test2 = timer(test2) = deco test2()=deco() def test2(name,age): print("test2:",name,age) # test1 = timer(test1) # test1() #-->deco test1() test2("alex",22)
#!/usr/bin/env python # -*- coding:utf-8 -*- import time user,passwd = 'alex','abc123' def auth(auth_type): print("auth func:",auth_type) def outer_wrapper(func): def wrapper(*args,**kwargs): print("wrapper func args:", *args,**kwargs) if auth_type == "local": username = input("Username:").strip() password = input("Password:").strip() if user == username and passwd == password: print("