python装饰器与函数参数用法教程

发布时间:2020-01-14编辑:脚本学堂
本文介绍了python装饰器的用法,python装饰器功能与函数参数用法,理解python装饰器的作用与函数参数本质,需要的朋友参考下。

python装饰器与函数参数用法

在python编程中,python装饰器主要作用是对函数进行一些修饰,它的出现是在引入类方法和静态方法时,为了定义静态方法出现的。

例子,为了把foo()函数声明成一个静态函数:
 

复制代码 代码示例:
class Myclass(object):
def staticfoo():
............
............
staticfoo = staticmethod(staticfoo)

用python装饰器实现,就是这样:
 

复制代码 代码示例:
class Myclass(object):
  @staticmethod  
  def staticfoo():
    .........
    .........

例2,其中同时涉及到一个重要内容,就是对于python中的函数的本质理解。

代码:
 

复制代码 代码示例:

# -*- coding: utf-8 -*-
from time import ctime
from time import sleep
def ftfunc(func):
def timef():
print "[%s] %s() called" % (ctime(),func.__name__)
return func()
return timef

@ftfunc
def foo():
print 'hello'

if __name__ == '__main__':

foo()
sleep(2)

for i in range(2):
sleep(1)
foo()

运行这段代码;可以看到终端依次会输出:
python装饰器与函数参数用法

其中ftfunc函数是我们自己自定义的一个函数,这个函数是以一个函数作为参数的函数,这也就满足了作为一个装饰器的要求,根据上面我们对于装饰器的等价变换规则,这段代码
 

复制代码 代码示例:
@ftfunc
def foo():
print 'hello'

可以转换成代码:
 

复制代码 代码示例:

def foo():
print 'hello'

foo = ftfunc(foo)

再结合上面原来的代码,即可以很快体会到了python装饰器的作用。

但在编写这段代码的时候,有一个地方打错了:
 

return func()
return timef

被我写成了:
 

return func
return timef

于是输出结果就是不一样,后来终于发现了一个重要的概念:"foo"是函数对象的引用,而"foo()"是函数对象的调用。关于对象引用是python的重要的基础概念,在python中一切都是对象,同时类型是属于对象,而不是变量。一切的变量只是对象的引用,相当于让这个变量指向这个对象。“foo”正好可以理解成一个变量,只不过是它指向一个函数的对象。而“foo()”是函数对象的调用,即调用这个对象,是要执行这个函数的功能的。这里需要慢慢理解品味。基于此:

运行结果和刚才是一模一样的。注意比较与刚才那段代码的不同之处,更加有利于理解。
 

复制代码 代码示例:

# -*- coding: utf-8 -*-
from time import ctime
from time import sleep
def ftfunc(func):
def timef():
print "[%s] %s() called" % (ctime(),func.__name__)
return func
return timef

@ftfunc
def foo():
print 'hello'

if __name__ == '__main__':

foo()()
sleep(2)

for i in range(2):
sleep(1)
foo()()

此代码运行结果:
python装饰器与函数参数用法2

还可以分别对返回的timef函数加上括号,看看结果会是怎么样的。
可以更好理解python中函数的概念。

>>> 查看更多python装饰器的实例教程