python 装饰器功能以及函数参数使用介绍
Jun 16, 2016 am 08:47 AM
python
装饰器
简单的说:装饰器主要作用就是对函数进行一些修饰,它的出现是在引入类方法和静态方法的时候为了定义静态方法出现的。例如为了把foo()函数声明成一个静态函数
复制代码 代码如下:
class Myclass(object):
def staticfoo():
............
............
staticfoo = staticmethod(staticfoo)
可以用装饰器的方法实现:
class Myclass(object):
def staticfoo():
............
............
staticfoo = staticmethod(staticfoo)
可以用装饰器的方法实现:
复制代码 代码如下:
class Myclass(object):
@staticmethod
def staticfoo():
.........
.........
这个例子很明显很容易就可以看懂。
说到这里我们举一个下面的例子,这个例子里面同时涉及到一个重要内容,就是对于python中的函数的本质理解。
代码:
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()
运行这段代码;我们可以看到终端依次会输出以下内容:
# -*- 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'
可以转换成以下的代码:
@ftfunc
def foo():
print 'hello'
可以转换成以下的代码:
复制代码 代码如下:
def foo():
print 'hello'
foo = ftfunc(foo)
再结合上面原来的代码我们很快就可以体会到了装饰器的作用。
但是我在编写这段代码的时候,有一个地方打错了:
这段代码:
def foo():
print 'hello'
foo = ftfunc(foo)
再结合上面原来的代码我们很快就可以体会到了装饰器的作用。
但是我在编写这段代码的时候,有一个地方打错了:
这段代码:
复制代码 代码如下:
return func()
return timef
被我写成了:
return func()
return timef
被我写成了:
复制代码 代码如下:
return func
return timef
于是输出结果就是不一样,后来终于发现了一个重要的概念:"foo"是函数对象的引用,而"foo()"是函数对象的调用。关于对象引用是python的重要的基础概念,在python中一切都是对象,同时类型是属于对象,而不是变量。一切的变量只是对象的引用,相当于让这个变量指向这个对象。“foo”正好可以理解成一个变量,只不过是它指向一个函数的对象。而“foo()”是函数对象的调用,即调用这个对象,是要执行这个函数的功能的。这里需要慢慢理解品味。基于此:
这样的一段代码运行结果和刚才是一模一样的。注意比较与刚才那段代码的不同之处,更加有利于理解。
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()()
此代码运行结果:
# -*- 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中函数的概念。
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章
两个点博物馆:邦格荒地地点指南
4 周前
By 尊渡假赌尊渡假赌尊渡假赌
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门工具标签

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Google AI 为开发者发布 Gemini 1.5 Pro 和 Gemma 2

仅用250美元,Hugging Face技术主管手把手教你微调Llama 3
