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装饰器的四种类型:函数装饰函数、函数装饰类、类装饰函数以及类装饰类。 ### 一、函数装饰函数 函数装饰器是最基础的形式,它是一个接收函数并返回新函数的普通函数。装饰器在定义后通常放置...
本主题将深入探讨Python3中的各种函数,包括基本语法、高级特性、递归、生成器与迭代器以及闭包和装饰器。 一、基本语法 Python3函数的基本定义使用`def`关键字,后跟函数名和圆括号,其中可以包含参数。例如,定义...
locals_info = frame.f_back.f_locals.copy() # 获取上一级(被装饰函数)的局部变量 print(f"函数 {func.__name__} 开始执行,参数: {args}, {kwargs}, 局部变量: {locals_info}") try: result = func(*args, *...
通过本文的介绍,你应该对如何在Python中使用装饰器有了更深入的理解。掌握装饰器的使用,将有助于你编写更加模块化、可重用和可维护的代码。随着你对Python的深入学习,你将发现装饰器的应用远不止于此,它还有更多...
### Python 函数装饰器及其应用 #### 一、函数装饰器概述 在 Python 中,**函数装饰器**是一种特殊的设计模式,它允许开发者在不修改原函数代码的情况下为函数增加额外的功能。装饰器本质上是一个接收函数作为参数...
4. 装饰器应该保持被装饰函数的签名,即不改变函数接受的参数和返回值。 文中给出了一个简单的例子,展示了一个简单的日志装饰器的创建和使用过程: ```python def log(func): def wrapper(): print('log开始') ...
Python装饰器是一种高级编程技巧,它允许我们修改或增强函数、方法或类的行为,而无需对原始代码进行任何更改。装饰器本质上是一个接收一个函数作为输入并返回一个新的函数的函数。这种设计模式在Python中非常常见,...
函数查询可能涉及到如何查找和使用Python内置函数、如何定义自定义函数、函数的参数传递机制(位置参数、关键字参数、默认值和可变参数)、函数装饰器等。理解这些概念将使你的代码更加模块化和可维护。 最后,...
【Python函数详解】 在Python编程语言中,函数是...总的来说,理解并熟练运用Python的函数是成为高效Python开发者的关键一步。这份7页的PDF文档将为初学者和有经验的开发者提供宝贵的参考,深入理解Python函数的精髓。
Python部分函数,也称为偏...这个速查表应该包含各种常见的部分函数用法,以及相关的例子和技巧,对于理解和应用Python部分函数非常有帮助。无论你是初学者还是经验丰富的开发者,都应该将其视为一个有价值的参考资料。
装饰器是 Python 的高级特性,允许我们在不修改函数源代码的情况下,增加函数的功能。装饰器本质上是一个接收函数作为参数并返回新函数的函数。 通过理解并熟练运用这些概念,你可以编写出更加高效、易于理解的 ...
虽然Python函数注解不影响程序行为,但它们可以提供类型信息,有助于代码的自我文档化和工具(如IDEs和静态类型检查器)理解函数预期的参数和返回类型。 了解并熟练运用这些Python函数特性,对于编写高效、可维护...
本篇文章将深入剖析Python装饰器的引入、作用、定义方法、以及如何应用装饰器进行实际编程。 首先,装饰器是面向对象编程中的一个概念,在其他编程语言中,装饰模式通常需要通过类的继承或者组合来实现。然而,...
在Python中,虽然不能直接定义真正的泛型类型,但可以通过使用抽象基类(如abc模块)中的@abstractmethod和@abstractproperty装饰器,或者在函数内部使用isinstance或issubclass进行类型检查来模拟泛型行为。...
在Python编程语言中,装饰器是一种强大的工具,它允许我们修改或增强函数、类或方法的行为,而无需改变它们的源代码。在这个“python装饰器写...通过学习这个案例,我们可以更好地理解和掌握Python装饰器这一高级特性。
此外,Atom-docblock-python可能还具备对不同类型的函数(如类方法、静态方法等)以及装饰器的支持,能够自适应地生成相应的docstring格式。 安装Atom-docblock-python插件的方法通常是通过Atom的内置包管理器apm...
本“Python函数视频”教程旨在深入探讨这一主题,帮助初学者和进阶者更好地理解和运用函数。 在视频教程中,你将首先了解函数的基本概念,包括如何定义函数、调用函数以及传递参数。Python函数通过`def`关键字进行...