设为首页 收藏本站
查看: 951|回复: 0

[经验分享] python笔记day5

[复制链接]

尚未签到

发表于 2018-8-14 07:23:12 | 显示全部楼层 |阅读模式
  http://www.cnblogs.com/wupeiqi/articles/4938499.html
  python解释器执行顺序:从上到下
  def foo(): -->将foo函数读入内存,但不执行函数体内容
  print 'abc'  -->略过这行
  foo  -->表示foo函数,foo指向函数的内存地址
  foo()  -->表示执行foo函数,反过头取执行函数体内容print 'abc'
  foo = lambda a : a + 1 -->foo指向另外一个函数的内存地址,这个函数实现的功能是a+1
  foo()  -->执行a+1这个函数的函数体
  函数调用函数:
  def f1(arg):
  arg()
  def func():
  print "func"
  f1(func)
  python解释器从上往下执行
  第一步:执行def f1(arg): 将函数写入内存,但是不执行函数体的内容arg()
  第二步:执行def func():将函数写入内存,但是不执行函数体的内容print 'func'
  第三步:执行f1(func)调用函数f1
  第四步:执行def f1(arg): ,这时arg = func,arg指向函数的内存地址
  第五步:执行arg(),arg() = func(),也就是执行func()函数
  第六步:执行def func():
  第七步:执行print '12'
  业务场景:
  基础平台运维编写各种基础函数,提供各种API给产线,来查询数据库,各个机器的使用情况等功能
  之前调用API没有做认证,现在想在500个函数中加入auth()函数做认证,基本的做法:
def auth():  xxxxxx
def f1():  auth()  -->
在函数体中增加auth()函数做认证print "f1"def f2():  auth()  -->
在函数体中增加auth()函数做认证print "f2"  但是由于开放封闭原则:
  函数体不能被修改,只能修改配置文件或者main()函数来修改函数的执行顺序,或者增加新的函数来改变实现的功能
  例如原来定义的函数执行顺序为1->2->3->4,现在修改为1->2->2.5->4->3,增加了一个2.5功能,并且调换了3和4的顺序
  因此需要这样写:
def auth(func):def inner():print '验证功能'func()return innerdef f1():  -->原函数print 'f1'retval = auth(f1)  retval()
  第一步:执行def auth(func): ,将auth()函数加载到内存,但不执行函数体内容
  第二步:执行def f1(): ,将f1()函数加载到内存,但不执行函数体内容
  第三步:执行retval = auth(f1),调用auth()函数,同时传参f1
  第四步:执行def auth(func): ,这时func == f1
  第五步:执行def inner():,将auth()函数加载到内存,但是不执行inner()函数的函数体
  第六步:执行return inner,这时retval == inner,retval也就等于整个inner()函数体
  第七步:执行retval(),retval()==inner(),也就是执行inner()函数体,inner()函数体中有func(),而func()==f1,就执行了原来的函数f1
  如果将retval = auth(f1),改写为f1= auth(f1) (第一个f1是新f1,第二个f1是老的f1函数)那么业务线的人就可以不用修改代码了
  python提供了简单的写法,这种写法就是装饰器:
def auth(func):def inner():print '认证功能'func()    print '打印日志'return innerdef auth_arg1(func):def inner(arg):print '认证功能'func(arg)    print '打印日志'return inner  @
auth  ==》会执行f1 = auth(f1),也就是inner()函数的返回值复制给f1def f1():print 'f1'@auth_arg1  ==》会执行f1 = auth(f1),也就是inner()函数的返回值复制给f1def f2(arg):print 'f2,arg'装饰器的实质就是在不修改f1函数体的情况下,执行f1函数之前,执行一个auth函数有了装饰器,基础平台给500个函数增加认证功能,在不破坏开放封闭原则的情况下,只需要写一个auth函数和500个@auth,auth函数的inner子函数中实现认证功能,业务线不需要做任何修改,实现的功能就是f1函数执行之前进行身份验证,f1功能执行之后打印日志当函数f2有一个参数的时候,需要另外写一个有一个参数的装饰器auth_arg1,在f2之前写上@auth_arg1即可第5天该看06了

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-551352-1-1.html 上篇帖子: python修改dns slave配置文件信息 下篇帖子: Python 连接Sql Server数据库 MSSql-brian
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表