python笔记day5

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 inner
def 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了
时间: 2024-11-12 19:14:34

python笔记day5的相关文章

Python学习day5作业-ATM和购物商城

Python学习day5作业 Python学习day5作业 ATM和购物商城 作业需求 ATM: 指定最大透支额度 可取款 定期还款(每月指定日期还款,如15号) 可存款 定期出账单 支持多用户登陆,用户间转帐 支持多用户 管理员可添加账户.指定用户额度.冻结用户等 购物车: 商品信息- 数量.单价.名称 用户信息- 帐号.密码.余额 用户可充值 购物历史信息 允许用户多次购买,每次可购买多件 余额不足时进行提醒 用户退出时 ,输出当次购物信息 用户下次登陆时可查看购物历史 商品列表分级显示 1

Python笔记_01列表 和元祖

Python笔记 第一章 列表和元祖 1.通用序列操作 所有序列都可以进行某些特定操作,包括:索引(indexing).分片(slicing).加(adding).乘(multiplying)以及检查某元素是否属于列表成员. 迭代:依次对序列中的每个元素重复执行某些操作. 序列的索引:通过元素在列表中的位置可以定位到该元素,这就是列表的索引,使用类似于list[0]对元素进行索引,索引0指向第一个元素.也可使用负数对元素进行索引,使用负数对元素索引时,列表中的最后一个元素由-1表示,例如list

玩蛇(Python)笔记之基础Part3

玩蛇(Python)笔记之基础Part1 一.集合 1.set 无序,不重复序列 {}创建,直接写元素 2.set功能 __init__()构造方法,,使用强制转换就会调用此方法 1 set1 = {'year', 'jiujiujiu'} 2 print(type(set1)) 3 # 创建集合 4 s = set() # 创建空集合 5 li = [11, 22, 11, 22] 6 s = set(li) set 3.集合的基本操作 1 # 操作集合 2 s1 = set() 3 s1.a

Python笔记(四)

在<Python笔记(三)>中,我记录关于Python中序列问题的知识.个人觉得确实比Java中的集合框架简单.之前也说了,Python是一种高级面向对象的语言,它的每一个变量都称为对象.今天我接触了面向对象的编程.下面是这篇博客的目录: 1.类与对象 2.输入输出 3.异常 类与对象: 我们都知道面向对象的语言具备四个特性:抽象,继承,封装,多态.Java,C++是这样,Python也不例外.在Python中,我们定义一个类,使用关键字class.形式如下:class classname:.

python笔记 - day7-1 之面向对象编程

python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: sele是什么? self是一个python自动会给传值得参数: 哪个对象执行方法,self就是哪个对象: 构造方法: 类中有一个特殊的方法,__init__,类()自动执行: 面向对象,三大特性: 封装,继承,多态:  

Python笔记之不可不练

如果您已经有了一定的Python编程基础,那么本文就是为您的编程能力锦上添花,如果您刚刚开始对Python有一点点兴趣,不怕,Python的重点基础知识已经总结在博文<Python笔记之不可不知>中,尽管本文是自己学习Python过程中的总结,在大神看来,或许略欠火候,希望批评指正,万分感谢! 本文是作者学习成绩的见证,请尊重劳动成果!版权归作者和博客园共有,欢迎转载,但请保留本文出处http://www.cnblogs.com/itred/p/4687287.html ,  作者:itRed

python笔记之列表和元组

pyhton的列表和元组,说白了其实就是一种数据结构,只是在python当中更加方便的去操作而已.. 1.序列 其实字符串就是采取序列的方式的: string = "hello" print string[0] 结果为:h 对比其他编程语言,python还有一个负值索引的概念: 序列的分片: first = [0,1,2,3,4,5,6,7,9] print first[1:6:2] 针对first[1:6:2]这条语句: 1代表的起始索引,不写,默认为0 6代表结束索引,不写默认为所

整理python笔记

1.python笔记:while.if.for.编码 2.  模拟登陆 3.  python笔记:字符.列表.字典.元祖.数据类型

玩蛇(Python)笔记之基础Part2

玩蛇(Python)笔记之基础Part2 一.列表 1.列表 别的语言叫数组 python牛逼非要取个不一样的名字 1 age = 23 2 name = ["biubiubiu", "jiujiujiu", 22, age] 3 # namecopy = name 4 # namecopy.pop() 5 print(name) 6 # print(namecopy) List 2.列表取值 正常index 从零开始,,取倒数加负号 倒数第一就是[-1] 3.列表