python 装饰函数是指这样一种神奇的函数。你在某个函数声明之前添加一行@func()之类的语句,于是,你可以对某个函数的各种行为进行编程。你可以在函数执行前后执行操作,改变函数接受的值,甚至可以完全忽略某个函数而执行其他的函数。我们把这样的函数称为装饰函数。装饰函数困扰了我很久的时间,特别是从C语言函数的角度,你是很难理解python函数可以作为一个对象进行操作这个概念。
其实,装饰函数并没有那么高深,只是需要我们一步一步慢慢来。
事实1 python中函数是一个对象,函数调用对应的是,调用这个对象的__call__方法。
class foo():
pass
a=foo
a() # 失败,显示foo不能被调用( not callable)
class foowithcall():
def __call__(self):
print 'hello'
b=foowithcall
b() # 成功
从上面的例子我们看出,foo本身只是一个对象,而如果我们为它加上了call方法,它就变成了类似于函数的对象。
事实2 嵌套函数定义中,外层声明变量对内层函数可见
def foo():
i = 88
def bar():
print i
return
return bar()
foo() # 打印88
============================================================================
基于以上两个事实,我们就可以开始编写自己的装饰函数了。首先介绍一下@符号。这个符号加在函数的前面,系统自动的将之下的函数作为参数对象传递给@后的方法。
def foo()
def atholder(f):
print f
return f
return atholder
@foo()
def hello():
print 'hello'
hello()
难点:这时,系统遇到带@方法的函数,将hello函数对象(并不包括hello后面的括号)作为参数传递给foo()返回的函数。(请仔细体会这句),执行后得到了return f这个函数对象,在调用这个对象上的call方法。
而我们在atholder里面就可以对f进行加工了,最常见的莫过于返回一个函数对象,其中包括了f的操作。
装饰函数
def foo():
def atholder(f):
def func(*args,**kwargs):
print 'before'
ret = f(*args,**kwargs)
print 'after'
return ret
return func
return atholder
@foo()
def hello():
print 'hello'
这是一个标准的对hello函数的装饰。其实就是将hello函数对象作为参数传给了atholder后,atholder返回了另一个函数对象,这个函数对象天生的知道了hello对象的存在,并且可以接收参数,再传递给hello对象。
==========================================================================================
|| Ecclesiastes 1:14 我 见 日 光 之 下 所 作 的 一 切 事 , 都 是 虚 空 , 都 是 捕 风
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
分享到:
相关推荐
或许你已经用过装饰器,它的使用方式非常简单但理解起来困难(其实真正理解的也很简单),想要理解装饰器,你需要懂点函数式编程的概念,python函数的定义以及函数调用的语法规则等,虽然我没法把装饰器变得简单,...
作用:实现python装饰器。 闭包三要素: – 必须有一个内嵌函数。 – 内嵌函数必须引用外部函数中变量。 – 外部函数返回值必须是内嵌函数。 闭包函数的调用方式: 变量 = 外部函数名(参数) 变量(参数) 函数名变量...
[翻译]理解python中的装饰器[翻译]理解PYTHON中的装饰器[翻译]理解python中的装饰器python的函数是对象函数引用手工装饰器装饰器阐述最后回
在Python里,函数是用def关键字后跟一个函数名称和一个可选的参数表列来创建的,可以用关键字return指定返回值。下面让我们创建和调用一个最简单的函数: >>> def foo(): ... return 1 >>> foo() 1 该函数的函数体...
一般情况下,在函数中可以使用一个装饰器,但是有时也会有两个或两个以上的装饰器。多个装饰器装饰的顺序是从里到外(就近原则),而调用的顺序是从外到里(就远原则)。 原代码 执行结果 装饰顺序 : 就近原则 被...
本文实例讲述了Python装饰器用法。分享给大家供大家参考,具体如下: 写装饰器 装饰器只不过是一种函数,接收被装饰的可调用对象作为它的唯一参数,然后返回一个可调用对象(就像前面的简单例子) 注意重要的一点,...
第7章 包、模块、函数与变量作⽤域 第8章 Python函数 第9章 ⾼级部分:⾯向对象 第10章 正则表达式与JSON 第11章 Python的⾼级语法与⽤法 第12章 函数式编程: 匿名函数、⾼阶函数、装饰器 第13章 实战:原⽣爬⾍ 第...
装饰器最早在Python 2.5中出现,它最初被用于加工函数和方法这样的可调用对象(callable object,这样的对象定义有__call__方法)。在Python 2.6以及之后的Python版本中,装饰器被进一步用于加工类。 装饰器主要是...
理解多个装饰器同时对一个函数的装饰过程 理解什么是多继承 理解MRO顺序的意义 super的作用 能够从内存的角度理解类属性和实例属性的区别 掌握定义property属性的两种方式:装饰器形式和类属性形式 了解常用魔方属性...
一、在装饰器中获取被装饰函数的参数 假设我们在开发web的时候,需要做反爬。要判断接口的访问来源我们就可以通过下面装饰器的方法来实现: def mydecorator(func): def wrapped(*args, **kwargs): print(进入...
装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们以装饰函数为例子介绍其用法。要理解在Python中装饰器的原理,需要一步一步来。本文尽量描述得浅显易懂,从最基础的内容讲起。 (注:以下使用...
装饰器对与Python新手以至于熟悉Python的人都是一个难理解, 难写的东西. 那么今天就分享一下我对Python 装饰器的理解 所谓装饰器仅仅是一种语法糖, 可作用的对象可以是函数也可以是类, 装饰器本身是一个函数, 其主要...
闭包是Python装饰器的基础。要理解闭包,先要了解Python中的变量作用域规则。 变量作用域规则 首先,在函数中是能访问全局变量的: >>> a = 'global var' >>> def foo(): print(a) >>> foo() global var 然后,在...
Python进阶通过实例详解装饰器(附代码) 你真的了解Python中的日期时间处理吗? Python进阶一步步理解Python中的元类metaclass Python进阶理解Python中的异步IO和协程(Coroutine),并应用在爬虫中 Python中最好用的...
python程序设计基础与应用 Python程序设计基础与应用是学习Python编程的基础... 除此之外,本课程还将教授一些关于编写可重用的Python函数的技巧,如中间函数、装饰器以及偏函数等。此外,学生也会学习在Python中创建自
我在这儿,分享一下我学习python装饰器的心得体会。 目录初识python之装饰器一、函数调用函数与装饰器装饰函数程序示例:调用运行结果:程序示例:调用运行结果:二、当装饰器函数需要参数时…程序示例:调用运行...
讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切。 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它变得更厚...
主要介绍了Python如何创建装饰器时保留函数元信息,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
很多初次接触到python的小伙伴可能并不理解闭包是什么,为什么有闭包,闭包有什么用,那么今天博主就从这三点来为大家讲解一下python的闭包 一、闭包是什么 官方定义: 在计算机科学中,闭包(英语:Closure),又称词法...