装饰器
必备知识
1.装饰器由至少两层函数定义出来
2.动态函数
3.函数返回值
4.三层及以上函数定义的装饰器
5.多个装饰器
最简单的装饰器的实现
#!/usr/bin/env python # -- coding: utf-8 -- __author__ = 'EchoRep' #定义一个函数,作为装饰器函数,目的是把原函数加一些功能返回 def auth(args): # 定义一个函数内部的函数,目的是给原函数加一些功能 def inner(): #这个是给原函数加入的新功能 print "this is before!!! **********************" #这个是调用原函数 args() #这个是返回内部函数,确保下面运行可以获取原函数的功能和新加入的功能 return inner #给原函数加上装饰器 @auth #定义原函数有一些功能 def f1(): print "this is function one." #定义一个主函数 def main(): #调用已经修改过的函数 f1() #限制程序入口 if __name__ == "__main__": main()
带有参数的装饰器
#!/usr/bin/env python # -- coding: utf-8 -- __author__ = 'EchoRep' #定义一个新的能带参数的装饰器 def authArgs(args): #定义一个内部函数给原来的函数加入新的功能 def inner(argsin): #在原函数执行之前加入的功能 print "before" #执行原函数 args(argsin) #在原函数执行之后加入的新功能 print "after" #返回加入了新功能的内部函数 return inner #定义一个函数,作为装饰器函数,目的是把原函数加一些功能返回 def auth(args): # 定义一个函数内部的函数,目的是给原函数加一些功能 def inner(): #这个是给原函数加入的新功能 print "this is before!!! *{22}" #这个是调用原函数 args() #这个是在函数执行之后再加入的功能 print "~~~~~~~~~~~~~~~~~~~~~ this is after!!!" #这个是返回内部函数,确保下面运行可以获取原函数的功能和新加入的功能 return inner #给原函数加上装饰器 @auth #定义原函数有一些功能 def f1(): print "this is function one." #给原函数加入带有参数的装饰器 @authArgs #定义一个带有参数的原函数 def f2(args): #这是原函数的功能 print "this is function %s" %args #定义一个主函数 def main(): #调用已经修改过的函数 f1() #加入参数,执行修改以后的函数 f2("hi,nice to meet you!!!!") #限制程序入口 if __name__ == "__main__": main()
上面只有一个参数,如果我们想要实现带两个参数,三个参数。。。。乃至于n个参数有两种做法:
第一种做法是依次定义n个带参数的装饰器来实现
第二种做法是定义一个能够兼容无参数,一个,两个,三个。。。n个参数的装饰器函数
*第二种做法的实现需要通过动态参数来配合
def func(*arg,**kwargs):
func2(*arg,**kwargs)
#!/usr/bin/env python # -- coding: utf-8 -- __author__ = 'EchoRep' #定义一个函数,作为装饰器函数,目的是把原函数加一些功能返回 def auth(args): # 定义一个函数内部的函数,目的是给原函数加一些功能,通过加入动态函数的方式解决了参数不固定的问题 def inner(*arg,**kwargs): #这个是给原函数加入的新功能 print "this is before!!! *{22}" #这个是调用原函数,配合函数使用动态函数的方式,解决了参数不固定的问题 args(*arg,**kwargs) #这个是在函数执行之后再加入的功能 print "~~~~~~~~~~~~~~~~~~~~~ this is after!!!" #这个是返回内部函数,确保下面运行可以获取原函数的功能和新加入的功能 return inner #给原函数加上装饰器 @auth #定义原函数有一些功能 def f1(): print "this is function one." #给原函数加入带有参数的装饰器 @auth #定义一个带有参数的原函数 def f2(args): #这是原函数的功能 print "this is function %s" %args #定义一个主函数 def main(): #调用已经修改过的函数 f1() #加入参数,执行修改以后的函数 f2("hi,nice to meet you!!!!") #限制程序入口 if __name__ == "__main__": main()
装饰器函数的返回值不仅在原函数里面有体现,在装饰器函数里面也需要再次返回,这样最后才可以获得我们需要的返回值。
多个装饰器可以参考“盒子模型”
三层以上的函数可以构成带多个参数的装饰器
函数内部获取不到同等级函数的名字作为赋值
递归
递归的使用:
1.计算器
2.前值相加数列
递归里面的返回值问题:
#func 没有返回值,或者说没有获取到返回值,原来是因为递归调用的时候,最后依次虽然返回了,
# 但是倒数第二次没有返回,所以一路返回的是none,也就是函数默认的返回值
模块
三种模块:
自定义模块
内置模块
第三方模块
两种导入模块的方法:
import os
os.argv
for os import argv
argv
导入模块需要注意一个问题,模块的路径问题“sys.path”