python 的装饰器,其实用到了以下几个语言特点:

  • 1. 一切皆对象
  • 2. 函数可以嵌套定义
  • 3. 闭包,可以延长变量作用域
  • 4. *args 和 **kwargs 可变参数

第1点,一切皆对象,包括函数。函数也是个对象,所以函数这个对象可以和其他任何对象一样被赋值给其它变量,包括作为实数传递给函数。

第2点,在函数中可以再定义一个函数,并且,结合第1点,函数是个对象,那么嵌套定义的函数,还可以被作为函数执行结果返回,也就是 return object。

第3点,类似 JS 的特性,就是在嵌套定义的函数销毁前,其外层函数的函数作用域一直存在。

第4点,则是为了处理参数上的方便。

普通装饰器

def decorator(func):
outer = '外层函数作用域定义的局部变量'
def inner(*args, **kwargs):
print outer
print args
print kwargs
return inner @decorator
def func(*args, **kwargs):
print 'hello world' # 以上装饰器作用等价于:
new_func = decorator(func) func(1, 2, 3, a='one', b='two')
new_func(1, 2, 3, a='one', b='two') # 外层函数作用域定义的局部变量
# (1, 2, 3)
# {'a': 'one', 'b': 'two'}
# 外层函数作用域定义的局部变量
# (1, 2, 3)
# {'a': 'one', 'b': 'two'}

带参数的装饰器

带参数的装饰器,其实是相当于又多了一层嵌套定义,装饰器函数返回的也是一个装饰器函数。

def decorator(info):
def really_dec(func):
outer = info
def inner(*args, **kwargs):
print outer
print args
print kwargs
return inner
return really_dec @decorator('我是装饰器参数')
def func(*args, **kwargs):
print 'hello world' func(1, 2, 3, a='one', b='two') # 我是装饰器参数
# (1, 2, 3)
# {'a': 'one', 'b': 'two'}

python 基础——装饰器的更多相关文章

  1. python基础——装饰器

    python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...

  2. python基础—装饰器

    python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...

  3. day5学python 基础+装饰器内容

    基础+装饰器内容 递归特性# 1.必须有一个明确的结束条件# 2.每次进入更深一层递归时,问题规模相比上次递归应有所减少# 3.递归效率不高 def run(n): print(n) if int(n ...

  4. Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle

    目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...

  5. python基础 (装饰器,内置函数)

    https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...

  6. python基础-装饰器,生成器和迭代器

    学习内容 1.装饰器 2.生成器 3.迭代器 4.软件目录结构规范 一:装饰器(decorator) 1.装饰器定义:本质就是函数,用来装饰其他函数,即为其他函数添加附加功能. 2.装饰器原则:1)不 ...

  7. python基础===装饰器@property 的扩展

    以下来自Python 3.6.0 Document: class property(fget=None, fset=None, fdel=None, doc=None) Return a proper ...

  8. <Python基础>装饰器的基本原理

    1.装饰器 所谓装饰器一般是对已经使用(上线)的函数增加功能. 但是因为一般的大公司的严格按照开放封闭原则(对扩展是开放的,对修改是封闭的),不会让你修改原本的函数. 装饰器就是在不改变原本的函数且不 ...

  9. python基础-装饰器

    一.什么是装饰器 装饰器本质就是函数,功能是为其他函数附加功能 二.装饰器遵循的原则 1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 三.实现装饰器的知识储备 装饰器=高阶函数+函数嵌套 ...

随机推荐

  1. C和设计原则

    ---DO NOT REPEAT YOURSELF--- 建设性的懒惰,是程序员的第一美德.最简单的懒惰就是不要重复自己,简单到一个命名规则,例如C语言中: int osip_list_init (o ...

  2. kindeditor 上传图片 显示绝对 路径

    在前台页面上 效果图 另外附上 urlType 属性的 参数说明: 改变站内本地URL,可设置空.relative.absolute.domain. 空为不修改URL,relative为相对路径,ab ...

  3. 无责任Windows Azure SDK .NET开发入门篇二[使用Azure AD 进行身份验证--2.1使用Azure AD需要了解几个概念]

    2.1使用Azure AD需要了解几个概念 l Azure AD目录 当你注册 Microsoft 云服务时,便会获得一个 Azure AD 目录.你可根据需要创建更多的目录.例如,可以将第一个目录保 ...

  4. js 控制DIV 预览打印

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> ...

  5. 25.怎样创建一个Swift项目?

    经历前面三部分的学习之后,我们对于Swift的有了基本的了解,知道它的基础语法,也知道了类.结构体.枚举.协议.扩展等等内容.但知道上面这些内容,并不代表我们就能很好的进行实际的项目开发了,本部分内容 ...

  6. 钉钉开发笔记(3)MySQL的配置

    最近在编写web的过程中,经常需要与后台工作人员互动.由于比较麻烦.没有效率. 就果断的请教了,公司的后台大牛,学习下数据库的一些简单操作,现在就把利用MySQL连接服务器, 进行可视化操作的简单步骤 ...

  7. Jquery 方式获取 iframe Dom元素

    Jquery 方式获取 iframe Dom元素 測试页面代码: <html>  <head>   <title>jquery方式,訪问iframe页面dom元素& ...

  8. java 计算一个方法的返回执行时间

    开始时间   long startTime = System.currentTimeMillis(); 程序业务逻辑代码() 结束时间  long endTime = System.currentTi ...

  9. FullScreenDownloader

    https://github.com/Gitdefllo/FullScreenDownloader

  10. 【JavaScript】Javascript中的函数声明和函数表达式

    Javascript有很多有趣的用法,在Google Code Search里能找到不少,举一个例子: <script> ~function() { alert("hello, ...