加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python中的修饰符@的作用

发布时间:2020-12-20 10:50:26 所属栏目:Python 来源:网络整理
导读:1.一层修饰符 1)简单版,编译即实现 在一个函数上面添加修饰符 @另一个函数名 的作用是将这个修饰符下面的函数作为该修饰符函数的参数传入,作用可以有比如你想要在函数前面添加记录时间的代码,这样每个函数调用时就能够知道是什么时候调用的,但是你不想

1.一层修饰符

1)简单版,编译即实现

在一个函数上面添加修饰符 @另一个函数名 的作用是将这个修饰符下面的函数作为该修饰符函数的参数传入,作用可以有比如你想要在函数前面添加记录时间的代码,这样每个函数调用时就能够知道是什么时候调用的,但是你不想手动地去给每个函数添加,那么就能够使用该修饰符实现这样的功能,下面举例说明:

#coding=UTF-8
import time

def showTime(fn):
    print(calling time : ,time.time())
    fn() #调用传入的参数

@showTime
def function1():
    print(running function1 )

@showTime
def function2():
    print(running function2 )

返回:

calling time :  1567076890.053299
running function1 
calling time :  1567076890.0533462
running function2 

?

但是发现showTime()函数这样子写,即使将fn()行调用代码删除,也会在编译时就输出时间信息:

import  time
def showTime(fn):
    print(calling time : ,time.time())

@showTime
def function1():
    print(running function1 )

@showTime
def function2():
    print(running function2 )

返回:

calling time :  1567077493.420067
calling time :  1567077493.420131

而且这个时候如果调用function1()会报错:

TypeError: NoneType object is not callable

?

2)调用才实现

如果去希望是在显示调用function1()和function2()函数时才显示时间,正确的写法是:

import time

def showTime(fn):
    def getTime():
        print(calling time : ,time.time())
        fn() #要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息
    return getTime

@showTime
def function1():
    print(running function1 )

@showTime
def function2():
    print(running function2 )

function1()
function2()

返回:

calling time :  1567077669.2308512
running function1 
calling time :  1567077669.230927
running function2 

?

3)传入参数

如果函数中需要传入参数:

def showTime(fn):
    def getTime(*args):#*args获得fn的参数
        print(args is : ,args) #查看传入的参数
        print(calling time : ,time.time())
        if len(args) > 0:
            fn(args[0]) #要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息
        else:
            fn()
    return getTime

@showTime
def function1(a):
    print(running function1 )
    print(a = ,a)

@showTime
def function2():
    print(running function2 )

function1(3)
function2()

返回:

args is :  (3,)
calling time :  1567077936.79216
running function1 
a =  3
args is :  ()
calling time :  1567077936.792191
running function2 

?

如果想要对传入的参数进行操作:

import time

def showTime(fn):
    def getTime(*args):#*args获得fn的参数
        print(args is : ,time.time())
        if len(args) > 0:
            n = args[0]
            n *= 2
            fn(n) #要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息
        else:
            fn()
    return getTime

@showTime
def function1(a):
    print(running function1 )
    print(a = ,)
calling time :  1567078015.031965
running function1 
a =  6
args is :  ()
calling time :  1567078015.0320058
running function2 

?

2.如果是双重修饰符

1)简单版本,编译即实现

import time
def sayHello(fn): print(
Hello) def showTime(fn): print(calling time : ,time.time()) fn(3) @sayHello @showTime def function1(a): print(running function1 ) print(a = ,a)

这个编译就会返回:

calling time :  1567078623.5239282
running function1 
a =  3
Hello

?

2)调用才实现

如果想要以sayHello -> showTime -> function1的顺序,写法就要变为:

?

#coding:utf-8
import time

def sayHello(fn): def hello(
*args): print(Hello) fn(*args) # 2 return hello # 1 def showTime(fn): def getTime(*args):#4 *args获得fn的参数 print(args is : ,time.time()) if len(args) > 0: n = args[0] n *= 2 fn(n) #5 要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息 else: fn() return getTime # 3 @sayHello @showTime def function1(a): # 5 print(running function1 ) print(a = ,a) function1(3)

?

等于sayHello(showTime(function1(a))),所以调用function1(3)时运行的顺序为 :

  • 先调用sayHello()返回的hello(3),此时传入的参数*args为(3,),然后调用hello中的fn(*args)
  • 其实就是调用showTime()返回的getTime(3),),然后调用getTime中的fn(n=6)
  • 其实就是调用function1(6),就结束了

返回:

Hello
args is :  (3,)
calling time :  1567078847.98264
running function1 
a =  6

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读