码迷,mamicode.com
首页 > 其他好文 > 详细

装饰器

时间:2018-08-12 21:44:06      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:访问   类对象   改变   ext   mysq   作用域   --   参数   安装   

装饰器 一.函数是第一类对象:指函数可以当做数据传递 1.可以被引用 如:x=1 ,y=x def foo(x,y): print(x,y) f=foo f(1,2) 2.可以当做函数的参数传入 def foo(): print(‘ad djf‘) def bar(yy): #print(yy) yy() bar(foo) ad djf 3.可以当做函数的返回值 def foo(): print(‘ad djf‘) def bar(): return foo f=bar() f() ad djf 4.可以当做容器类型的元素 def foo(): print(‘ad djf‘) def bar(): return foo l=[foo,bar] print(l[0]()) 二: 函数的嵌套调用: def foo(x,y): if x > y: return x else: return y def foo1(a,b,c,d): res1=foo(a,b) res2=foo(res1,c) res3=foo(res2,d) return res3 函数的嵌套定义: def f1(): def f2(): print(‘oooo‘) def f3(): print(‘33333‘) f3() f2() f1() 三.名称空间:存放变量的名字和值绑定关系的地方 分类: 1.内置名称空间 python解释器内置的名字,len,print等 2.全局名称空间 执行ptyhon文件时生效 文件级别定义的名字 3.局部名称空间 函数调用时生效,调用结束失效 函数内部定义的名字 加载顺序:内置--->全局--->局部 访问名字顺序:局部--->全局--->内置 x=2 #全局 def f1(): x=1 #局部 def f2(): print(x) f2() f1() 全局作用域(全局范围):内置名称空间和全局名称空间的名字,全局存活,全局有效。查看全局名称空print(globals()) 局部作用域(局部范围):局部名称空间的名字,临时存活,局部有效。查看局部名称print(localse()) x=2 def f1(): global x #指定要改变的全局名称 x=1 f1() x=2 def f1(): x=3 def f2(): nonlocal x #指定要改变上次层的局部名称 x=0 f2() f1() 四. 1.打破函数层级限制来调用函数 def foo(): def iner(): print(‘2222‘) return iner f=foo() 2.函数的作用域关系是在函数定义阶段就已经固定了,与调用位置无关。 x=1 def foo(): x=2 def iner(): print(x) return iner f=foo() def bar(): x=3 f() bar() 五. 闭包函数: 1.定义在函数内部的函数 2.该函数的函数体代码包含对外部作用域(而不是全局作用域)名字的引用 3.通常将闭包函数用return返回,然后可以再任意使用 def foo(): x=2 y=3 def iner(): print(x,y) return iner f=foo() print(f.__closure__[0,1].cell_contents) 爬页面: import requests #安装pip3 install requests def get(url): requests.get(url) if response.status_code == 200: print(response.text) get(‘https://www.baidu.com‘) 闭包传参: def foo(url) def get(): requests.get(url) if response.status_code == 200: print(response.text) return get baidu=foo(‘https://www.baidu.com‘) baidu() 六: 1.开放封闭原则:对扩展开放,对修改是封闭的 2.装饰器:装饰它人,器值的是任意可调用的对象,现在的场景装饰器-->函数,被装饰的对象也是-->函数 原则:1.不会修改装饰器的源代码,2.不修改装饰器对象的调用方式 装饰器的目的:在遵循1,2的前提下为被装饰的对象添加上新功能。 例: inport time def index(): time.sleep(3) print(‘welecome to index‘) def foo(goso): #goso=index #最原始的index def line(): start=time.time() #time.time()时间戳,以单位 goso() #原始的index() stop=time.time() print(‘run time is %s‘ %(stop-start)) retuen line index=foo(index) index() #foo() 装饰器的语法:在被装饰对象的上方单独的一行写上,@装饰器名 inport time def foo(goso): #goso=index #最原始的index def line(): start=time.time() #time.time()时间戳,以单位 goso() #原始的index() stop=time.time() print(‘run time is %s‘ %(stop-start)) retuen line @foo #等于index=foo(index),自动调用下面的函数名,把值赋给装饰器,并且变量名与调用函数名相同。 def index(): time.sleep(3) print(‘welecome to index‘) index() #foo() 1.如果函数理由返回值: inport time def foo(goso): #goso=index #最原始的index def line(): start=time.time() #time.time()时间戳,以单位 res=goso() #原始的index() stop=time.time() print(‘run time is %s‘ %(stop-start)) return res return line @foo #等于index=foo(index),自动调用下面的函数名,把值赋给装饰器,并且变量名与调用函数名相同。 def index(): time.sleep(3) print(‘welecome to index‘) retuen 1 res=index() print(res) 2.传参: inport time def foo(goso): #goso=home #最原始的index def line(*args,**kwargs): start=time.time() #time.time()时间戳,以单位 res=goso(*args,**kwargs) #原始的index() stop=time.time() print(‘run time is %s‘ %(stop-start)) return res return line @foo #等于index=foo(index),自动调用下面的函数名,把值赋给装饰器,并且变量名与调用函数名相同。 def home(name): print(‘welecome %s to home pagc‘ %nam ) home(‘abc‘) 3.有参装饰器: import time def auth2(engin=‘file‘): def foo(goso): def line(*args,**kwargs): if engin == ‘file‘: name=input(‘name>>:‘).strip() password=input(‘password>>:‘).strip() if name == ‘bili‘ and password == ‘123456‘: print(‘login successful‘) return line(*args,**kwargs) else: print(‘login err‘) elif engin == ‘mysql‘: print(‘myql auth‘) elif engin = ‘ldap‘: print(‘ldap auth‘) else: print(‘engin not exists‘) return line return foo @auth2(engin=‘mysql‘) def index(): time.sleep(3) print(‘welecome to index‘) retuen 1 res=index(‘egon‘) print(res) 4.wraps: inport time def foo(goso): @wraps(goso) def line(*args,**kwargs): start=time.time() #time.time()时间戳,以单位 res=goso(*args,**kwargs) stop=time.time() print(‘run time is %s‘ %(stop-start)) return res return line @foo def index(): ‘‘‘注释‘‘‘ time.sleep(3) print(‘welecome to index‘) retuen 1 print(help(index))

装饰器

标签:访问   类对象   改变   ext   mysq   作用域   --   参数   安装   

原文地址:http://blog.51cto.com/13399294/2158283

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!