python 装饰器功能以及函数参数使用介绍

时间:2022-04-03 05:12:32 

简单的说:装饰器主要作用就是对函数进行一些修饰,它的出现是在引入类方法和静态方法的时候为了定义静态方法出现的。例如为了把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()


运行这段代码;我们可以看到终端依次会输出以下内容:

python 装饰器功能以及函数参数使用介绍
其中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()()


此代码运行结果:

python 装饰器功能以及函数参数使用介绍

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

标签:python,装饰器
0
投稿

猜你喜欢

  • Python实现的多项式拟合功能示例【基于matplotlib】

    2022-02-18 14:44:08
  • 如何在js中使用FileSystemObject(fso)

    2007-09-23 09:10:00
  • 对SQL Server数据库进行优化的经验总结

    2010-07-26 14:52:00
  • 古老的问题:清除浮动

    2009-02-12 11:21:00
  • 使用Python的Treq on Twisted来进行HTTP压力测试

    2023-01-26 22:29:28
  • python实现二分查找算法

    2022-08-30 21:58:54
  • Python使用Asyncio实现检查网站状态

    2023-01-23 18:56:39
  • sql面试题(查看数据中指定几行记录)

    2024-01-13 10:58:58
  • nodejs利用ajax实现网页无刷新上传图片实例代码

    2024-05-13 10:05:11
  • python中dict()的高级用法实现

    2022-06-16 23:24:29
  • django如何实现视图重定向

    2022-05-28 12:22:13
  • python SSH模块登录,远程机执行shell命令实例解析

    2022-07-24 21:09:22
  • 24式加速你的Python(小结)

    2023-09-25 10:25:24
  • 使用pt-kill根据一定的规则来kill连接的方法

    2024-01-26 01:18:37
  • 浅谈python字典多键值及重复键值的使用

    2022-08-12 03:50:29
  • Python学习之循环方法详解

    2021-04-13 21:07:15
  • tensorflow 实现打印pb模型的所有节点

    2022-09-28 22:37:33
  • python基于property()函数定义属性

    2022-11-01 04:55:14
  • 简单实现python画圆功能

    2021-06-06 02:39:36
  • C#连接SQL Server数据库的实例讲解

    2024-01-28 04:14:01
  • asp之家 网络编程 m.aspxhome.com