北京网站关键词优化公,建站宝盒建站系统,电子商务网站技术,正规接单赚佣金的app1.情景引入。 现在已经完成了一个python项目#xff0c;但是我们为了安全起见#xff0c;我们需要加入验证机制。不是所有人都能调用函数
原始源代码def f1():print f1def f2():print f2def f3():print f3 由于必须遵循开发闭包的原则#xff0c;所以我们应该尽可能的是不去… 1.情景引入。 现在已经完成了一个python项目但是我们为了安全起见我们需要加入验证机制。不是所有人都能调用函数
原始源代码def f1():print f1def f2():print f2def f3():print f3 由于必须遵循开发闭包的原则所以我们应该尽可能的是不去改动原来函数的内部代码而是通过其他的一些方法添加新的功能 比如通过下面这样的方法 #首先定义一个验证函数参数为一个函数
def verification(func):print(verification success!!!)return func #返回传入函数的首地址def f1():print f1def f2():print f2def f3():print f3f1verification(f1) #执行这一句代码后会直接输出verification success!!!因为我们执行了verification这个函数。然后返回传入函数的地址 #再执行返回的函数,这样就会执行f1()这个函数
f1() #最终结果verification success
f1换一种写法实现和上面同样的功能——–装饰器 def verification(func):print(verification success!!!)return func #返回传入函数的首地址verification
def f1():print f1 verification跟上一段代码的f1verification(f1)这条语句等价此时的f1已经是verification函数的返回值了即func 上面的代码不经过任何调用直接运行
结果
verification success!!! 加一条代码
f1f1() #相当于f1func(),func是verification返回的函数即原f1()函数结果
verification success
f1 由此我们发现了一个问题那就是我们直接使用verification的时候他是直接执行了verification这个函数因此他会先有输出”verification success“这就出现了不统一的问题按照我们原来的设想是”verification success“和”f1“应该同时输出的。因此我们用相同的原理写一个内部函数通过返回内部函数的地址达到不执行函数的效果 代码如下 def verification(func):def inner():print verification successfunc()return inner #返回了一个函数的地址没有直接执行verification
def f3():print f3 此时函数f3已经变成了inner了然后我们调用f3,即inner f3() #这里就直接执行了inner函数 输出结果
verification success
f1 实现原函数无返回值 def verification(func):def inner(arg):if arg100:func(arg)else:print verification failreturn innerverification
def f1(num):print numverification
def f2(num):print numf1(101)
f2(88)
结果
101
verification fail原函数有返回值 def verification(func):def inner(arg):if arg100:return func(arg)else:return verification failreturn innerverification
def f1(num):return data is %d%numverification
def f2(num):return data is %d % numprint f1(101)
print f2(88)结果
data is 101
verification fail 多参数传递 验证功能的函数
def verification(func):def inner(*args,**kargs):if password in kargs:passwordkargs[password]else:password000if password233:return func(*args)else:return verification failreturn innerverification
def f1(num):return data is %d%(num)verification
def f2(num):return data is %d % numprint f1(101,password233) #此时的f1其是inner函数
print f2(88)#结果
data is 101
verification fail 2.装饰器 就如同以上代码一样想要对一个已有的模块做一些“修饰工作”所谓修饰工作就是想给现有的模块加上一些小装饰一些小功能这些小功能可能好多模块都会用到但又不让这个小装饰小功能侵入到原有的模块中的代码里去。 3.进阶版—-带参数Decrorator def makeHtml(tag,*args,**kwargs):def realDeco(main_fun):if css_class in kwargs:css_classclass{}.format(kwargs[css_class])else:css_classNonedef wrapper(*args,**kwargs):return tag css_classmain_fun(*args,**kwargs)/tagreturn wrapperreturn realDecomakeHtml(tagb,css_classbold_css)
def index():return hello worldprint index() 执行过程 到makeHtml时程序执行过程 1.先执行makeHtml(tag’b’,class’bold_css’)函数,返回realDeco的地址 2.执行realDeco(index),获取到css_class变量的值,返回wrapper 3.执行print index().此时此刻的indexwrapper执行wrapper()函数 4.执行main_fun(即原index函数)重新拼接得到b classbold_csshello world/b最后返回了这个值 执行结果 b classbold_csshello world/b 待续。。。。 转载于:https://www.cnblogs.com/cmustard/p/6769936.html