2015-11-22 第五天

装饰器

必备知识

1.装饰器由至少两层函数定义出来

2.动态函数

3.函数返回值

4.三层及以上函数定义的装饰器

5.多个装饰器

 

最简单的装饰器的实现

#!/usr/bin/env python
# -- coding: utf-8 --
__author__ = 'EchoRep'


#定义一个函数,作为装饰器函数,目的是把原函数加一些功能返回
def auth(args):
    # 定义一个函数内部的函数,目的是给原函数加一些功能
    def inner():
        #这个是给原函数加入的新功能
        print "this is before!!!\n**********************"
        #这个是调用原函数
        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!!!\n*{22}"
        #这个是调用原函数
        args()
        #这个是在函数执行之后再加入的功能
        print "~~~~~~~~~~~~~~~~~~~~~\nthis 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!!!\n*{22}"
        #这个是调用原函数,配合函数使用动态函数的方式,解决了参数不固定的问题
        args(*arg,**kwargs)
        #这个是在函数执行之后再加入的功能
        print "~~~~~~~~~~~~~~~~~~~~~\nthis 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”

posted @ 2015-11-27 23:33  EchoRep  阅读(388)  评论(0编辑  收藏  举报