• 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!!!
    **********************"
            #这个是调用原函数
            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”

  • 相关阅读:
    Android 引用资源
    Android res目录结构
    Android 目录结构
    ubuntu 14.04 (desktop amd 64) 查看配置参数
    ros service
    install ros-indigo-map-server
    python 单例
    查看指定目录空间占用
    shell 设置超时时间
    nohup 不生成 nohup.out的方法
  • 原文地址:https://www.cnblogs.com/echorep/p/5001979.html
Copyright © 2020-2023  润新知