python 装饰器功能以及函数参数使用介绍
2012-01-27 20:50
1086 查看
简单的说:装饰器主要作用就是对函数进行一些修饰,它的出现是在引入类方法和静态方法的时候为了定义静态方法出现的。例如为了把foo()函数声明成一个静态函数
复制代码 代码如下:
class Myclass(object):
def staticfoo():
............
............
staticfoo = staticmethod(staticfoo)
可以用装饰器的方法实现:
复制代码 代码如下:
class Myclass(object):
@staticmethod
def staticfoo():
.........
.........
这个例子很明显很容易就可以看懂。
说到这里我们举一个下面的例子,这个例子里面同时涉及到一个重要内容,就是对于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()
运行这段代码;我们可以看到终端依次会输出以下内容:
@ftfunc
def foo():
print 'hello'
可以转换成以下的代码:
复制代码 代码如下:
def foo():
print 'hello'
foo = ftfunc(foo)
再结合上面原来的代码我们很快就可以体会到了装饰器的作用。
但是我在编写这段代码的时候,有一个地方打错了:
这段代码:
复制代码 代码如下:
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()()
此代码运行结果:
复制代码 代码如下:
class Myclass(object):
def staticfoo():
............
............
staticfoo = staticmethod(staticfoo)
可以用装饰器的方法实现:
复制代码 代码如下:
class Myclass(object):
@staticmethod
def staticfoo():
.........
.........
这个例子很明显很容易就可以看懂。
说到这里我们举一个下面的例子,这个例子里面同时涉及到一个重要内容,就是对于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()
运行这段代码;我们可以看到终端依次会输出以下内容:
其中ftfunc函数是我们自己自定义的一个函数,这个函数是以一个函数作为参数的函数,这也就满足了作为一个装饰器的要求,根据上面我们对于装饰器的等价变换规则,这段代码
@ftfunc
def foo():
print 'hello'
可以转换成以下的代码:
复制代码 代码如下:
def foo():
print 'hello'
foo = ftfunc(foo)
再结合上面原来的代码我们很快就可以体会到了装饰器的作用。
但是我在编写这段代码的时候,有一个地方打错了:
这段代码:
复制代码 代码如下:
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()()
此代码运行结果:
其实还可以分别对返回的timef函数加上括号,看看结果会是怎么样的。可以更好理解python中函数的概念。
您可能感兴趣的文章:
相关文章推荐
- python 装饰器功能以及函数参数使用介绍
- python 装饰器功能以及函数参数使用
- 【转】python 装饰器功能以及函数参数使用
- Python使用修饰器执行函数的参数检查功能示例
- python3.5函数的参数样式种类以及装饰器
- 关于Python函数中self参数使用介绍
- 这篇文章主要介绍了Python使用函数默认值实现函数静态变量的方法,是很实用的功能
- GoLang数组初始使用方法以及作为函数参数(1)
- Python socket编程之(一):socket的基本参数和函数介绍
- 2016/09/18 print_r函数第二个参数是否使用过,如果用过请说出具体功能
- C语言中strtok使用方法与原理,以及自实现函数功能
- JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
- Boost关于bind的使用以及函数对象和传递参数的问题
- caffe的python接口学习(12):查看属性、方法以及函数参数
- 函数的缺省参数和函数初始化示例以及布尔型参数的使用示例
- Python自学笔记之函数2——定义函数以及函数的参数
- Python中函数的参数传递与可变长参数介绍
- Python中函数的参数传递与可变长参数介绍
- 小议Python中自定义函数的可变参数的使用及注意点
- python函数使用参数技巧笔记