• @ python的修饰符


    @符号在python语言中具有特殊含义,用来作为修饰符使用。
    具体可以参考下面的代码:

    #! /usr/bin/env python
    #
    coding=utf-8

    from time import ctime, sleep

    def tcfunc(func):
        
    def wrappedFunc():
            
    print '[%s] %s() called' %(
                ctime(), func)
            
    return func()
        
    print "in tcfunc called"
        
    print "wrapped func %s" %wrappedFunc
        
    return wrappedFunc

    # decorator 仅调用tcfunc函数,该函数将foo作为一个参数,返回一个
    #
     wrappedFunc函数对象,用该对象来取代foo函数在外部的调用,foo
    #
     定义的函数只能够在内部进行调用,外部无法获取其调用方式!!
    @tcfunc         # call sequence is : tcfunc(func) --> wrappedFunc -- > func
    def foo():
        
    print "in foo called"
        
    pass

    print "foo func : %s" %foo

    foo()  
    print "-"*100
    sleep(
    4)

    for i in range(2):
        sleep(i)
        foo()
        
    print "-"*100

    上面函数中,tcfunc定义了一个函数,里面内嵌一个函数,该函数需要一个func的参数。

    @tcfunc则表示下面定义的函数将函数名作为tcfunc的参数被tcfunc调用。
    代码:
    @tcfunc
    def foo():
        
    pass

    在定义的时候,就被tcfunc调用,即tcfunc(foo),该函数返回一个wrappedFunc对象,而该定义foo函数名对象其实已经被wrappedFunc对象给取代, foo()定义的函数只在tcfunc函数内部作为参数被使用!我们可以通过打印它们的地址来查看tcfunc外部调用的foo与wrappedFunc是否为同一个对象:

    in tcfunc called
    wrapped func <function wrappedFunc at 0x01A3DD30>
    foo func : <function wrappedFunc at 0x01A3DD30>
    [Thu Jan 08 00:04:35 2009] <function foo at 0x01A3DCF0>() called
    in foo called
    ----------------------------------------------------------------------------------------------------
    [Thu Jan 08 00:04:39 2009] <function foo at 0x01A3DCF0>() called
    in foo called
    ----------------------------------------------------------------------------------------------------
    [Thu Jan 08 00:04:40 2009] <function foo at 0x01A3DCF0>() called
    in foo called
    ----------------------------------------------------------------------------------------------------

    从中可以看到,在tcfunc外部的函数对象与wrappedFunc的函数对象是同一个对象,在tcfunc内部参数func中调用的
    才是实际定义的foo函数对象!!!

  • 相关阅读:
    ASCII 32个控制字符含义
    MFC中获取指定打印机的打印队列的方法
    某品牌led报文信息分析
    SQL Server 企业版没有 Management Studio管理工具 无法安装工作站组件 的解决方法(无需卸载重装)
    xla文件修改办法
    关于ALILIB
    编译器如何根据头文件来找到相应实现的cpp文件?
    C#调用C++接口提示找不到指定的模块解决方法,本机正常
    DataGridView中实现右击选中当前行功能,并通过ContextMenuStrip获取当前行
    C#递归获取文件列表
  • 原文地址:https://www.cnblogs.com/ubunoon/p/decorate_python.html
Copyright © 2020-2023  润新知