python 装饰器功能以及函数参数使用介绍
发布时间:2020-12-16 20:08:41 所属栏目:Python 来源:网络整理
导读:简单的说:装饰器主要作用就是对函数进行一些修饰,它的出现是在引入类方法和静态方法的时候为了定义静态方法出现的。例如为了把foo()函数声明成一个静态函数 复制代码 代码如下: class Myclass(object): def staticfoo(): ............ ............ staticf
简单的说:装饰器主要作用就是对函数进行一些修饰,它的出现是在引入类方法和静态方法的时候为了定义静态方法出现的。例如为了把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()() 此代码运行结果: 其实还可以分别对返回的timef函数加上括号,看看结果会是怎么样的。可以更好理解python中函数的概念。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容