内容简介:013装饰器(重点)
##闭包 :内部函数,在外部调用不在他函数范围的变量
def outer(): x=10 def inner(): print(x) return inner #outer()() f=outer() f() View Code
这里inner就是一个闭包,闭包=内部函数+环境,这里环境是x=10。
闭包是为了解释调用不在他范围的变量的现象
##装饰器
1 import time 2 def show_runtime(func): 3 def inner(): 4 start_time=time.time() 5 time.sleep(1) 6 func() 7 end_time=time.time() 8 print(end_time-start_time) 9 return inner 10 11 def f(): 12 print('aiq') 13 14 f=show_runtime(f) #装饰f函数 15 f() View Code
show_runtime()方法就是一个装饰器
高大上的用法:
@show_runtime # 等于f=show_runtime(f),这样已经装饰了 def f(): print('aiq')
#装饰器里面的参数,在inner函数加参数,以及inner里面的函数也要加参数
import time def show_runtime(func): def inner(*x,**y): start_time=time.time() func(*x,**y) end_time=time.time() print(end_time-start_time) return inner @show_runtime #等于f=show_runtime(f) def add(*a,**b): sum=0 for i in a: sum+=i print(sum) time.sleep(1) add(3,5,7) View Code
import time def logger(flag=False): def show_runtime(func): def inner(*x,**y): start_time=time.time() func(*x,**y) end_time=time.time() print(end_time-start_time) if flag==True: #如果标记是True则执行 pass return inner return show_runtime @logger(True) #等于先调用logger函数,然后在执行@show_time,这里相当于闭包,调用外部的变量 def add(*a,**b): sum=0 for i in a: sum+=i print(sum) time.sleep(1) add(3,5,7) View Code
作业:
1 # __author: _nbloser 2 # date: 2017/12/25 3 # username, passwd = 'xia', 123 # 要在文件里面的 4 def read_user_messege(file_name): 5 f = open(file_name) 6 data = eval(f.read()) 7 f.close() 8 return data 9 10 11 def logger(auth_type='jingdong'): 12 def decorator(func): 13 def inner(): 14 global status_login 15 if status_login == False: 16 username_input = input('input username:') 17 user_table = read_user_messege(''.join([auth_type, '.txt'])) 18 if username_input in user_table: 19 passwd_input = input('input passwd:') 20 if user_table[username_input] == passwd_input: 21 status_login = True 22 func() 23 else: 24 print('密码错误,登录失败!') 25 else: 26 print('没有该用户') 27 if status_login == True: 28 func() 29 30 return inner 31 32 return decorator 33 34 35 @logger() 36 def home(): 37 print("welcome, home page.") 38 39 40 @logger('wechat') 41 def finance(): 42 print('finance.') 43 44 45 @logger() 46 def book(): 47 print('book') 48 49 50 status_login = False 51 while True: 52 print('1:home\n' 53 '2:finance\n' 54 '3:book\n' 55 'others:exit\n') 56 elect = input('>>>') 57 if elect == '1': 58 home() 59 elif elect == '2': 60 finance() 61 elif elect == '3': 62 book() 63 else: 64 break View Code
jingdong.txt: {'xia': 'aiq', 'q': 'aix'}
wechat.txt:{'xia': 'wh_aiq', 'q': 'wh_aix'}
补充书中例子:因为这个没有基础,个人觉得多写几个熟悉。
1 # __author: _nbloser 2 # date: 2017/12/25 3 4 def foo(f): 5 """foo function Docstring""" 6 7 def wrapper(*x, **y): 8 """wrapper doc""" 9 print('调用函数:', f.__name__) 10 return f(*x, **y) 11 12 return wrapper 13 14 @foo 15 def bar(x): 16 return x**2 17 18 if __name__=='__main__': 19 print(bar(2)) 20 print(bar.__name__) 21 print(bar.__doc__) View Code
1 # __author: _nbloser 2 # date: 2017/12/25 3 4 def outter(func): 5 def inner(*x, **y): 6 print('aiq') 7 func(*x, **y) 8 9 return inner 10 11 12 @outter 13 def my_add(a, b): 14 print(a + b) 15 16 17 if __name__ == '__main__': 18 my_add(2, 8) View Code
1 # __author: _nbloser 2 # date: 2017/12/25 3 4 import time, functools 5 6 7 def timeit(func): 8 def wrapper(*args): 9 start = time.perf_counter() 10 func(*args) 11 end = time.perf_counter() 12 print('运行时间:', end - start) 13 14 return wrapper 15 16 17 @timeit 18 def my_sum(n): 19 sum = 0 20 for i in range(n): 21 sum += i 22 print(sum) 23 24 25 if __name__ == '__main__': 26 my_sum(10000) View Code
1 # __author: _nbloser 2 # date: 2017/12/25 3 4 import time 5 6 7 def outer(func): 8 def inner(*args): 9 start_time = time.time() 10 func(*args) 11 time.sleep(1) 12 end_time = time.time() 13 print('运行时间:', end_time - start_time) 14 15 return inner 16 17 18 @outer 19 def my_factorial(n): 20 product = 1 21 for i in range(2, n): 22 product *= i 23 print(product) 24 25 26 my_factorial(25) View Code
1 # __author: _nbloser 2 # date: 2017/12/25 3 def make_bold(func): 4 def wrapper(*args): 5 return ''.join(['<b>', func(*args), '<b/>']) 6 7 return wrapper 8 9 10 def make_italic(func): 11 def wrapper(*args): 12 return ''.join(['<i>', func(*args), '</i>']) 13 14 return wrapper 15 16 17 @make_bold 18 @make_italic 19 def html_tags(str1): 20 return str1 21 22 23 print(html_tags('hello')) 24 # 运行结果:<b><i>hello</i><b/> View Code
以上所述就是小编给大家介绍的《013装饰器(重点)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。