python 基础——装饰器
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 基础——装饰器的更多相关文章
- python基础——装饰器
python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...
- python基础—装饰器
python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...
- day5学python 基础+装饰器内容
基础+装饰器内容 递归特性# 1.必须有一个明确的结束条件# 2.每次进入更深一层递归时,问题规模相比上次递归应有所减少# 3.递归效率不高 def run(n): print(n) if int(n ...
- Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle
目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...
- python基础 (装饰器,内置函数)
https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...
- python基础-装饰器,生成器和迭代器
学习内容 1.装饰器 2.生成器 3.迭代器 4.软件目录结构规范 一:装饰器(decorator) 1.装饰器定义:本质就是函数,用来装饰其他函数,即为其他函数添加附加功能. 2.装饰器原则:1)不 ...
- python基础===装饰器@property 的扩展
以下来自Python 3.6.0 Document: class property(fget=None, fset=None, fdel=None, doc=None) Return a proper ...
- <Python基础>装饰器的基本原理
1.装饰器 所谓装饰器一般是对已经使用(上线)的函数增加功能. 但是因为一般的大公司的严格按照开放封闭原则(对扩展是开放的,对修改是封闭的),不会让你修改原本的函数. 装饰器就是在不改变原本的函数且不 ...
- python基础-装饰器
一.什么是装饰器 装饰器本质就是函数,功能是为其他函数附加功能 二.装饰器遵循的原则 1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 三.实现装饰器的知识储备 装饰器=高阶函数+函数嵌套 ...
随机推荐
- 对Spring.Net的AOP一些思考及应用
前言 这几天在配置Spring.NET,配到AOP的时候发现自己现在还是没有理解到Spring AOP的实现,只是认识到了一个思想,以前配的时候,看的是给好的例子用,真正用的时候还是要想一下 ...
- mysql index的长度限制
在InnoDB Storage Engine中单独一个列的最大的索引长度为767bytes,utf8字符集中,一个字符占3个字节,所以如果列的类型为char,那么要想在此列上建立索引,此列最多只能有2 ...
- [转载]SQL Server内核架构剖析
原文链接:http://www.sqlserver.com.cn 我们做管理软件的,主要核心就在数据存储管理上.所以数据库设计是我们的重中之重.为了让我们的管理软件能够稳定.可扩展.性能优秀.可跟踪排 ...
- App Submission Issues
查看原文: http://leancodingnow.com/app-submission-issues/ I bet many iOS developers are busy submitting ...
- SCCM 2007 R2部署、操作详解系列之概念
站点类型 在安装站点时,您决定它将是主站点还是辅助站点.然后,在安装其他站点时,您可以选择将其安排到层次结构关系中,以便父站点管理子站点,中央站点收集所有站点信息,从而进行集中式管理.也可以根据业务和 ...
- python学习进阶一
map()函数 def format_name(s): return s.capitalize() print map(format_name, ['adam', 'LISA', 'barT']) R ...
- C# udpclient 发送数据断网后自动连接的方法
需求 有一个winform程序, 用来调试路由器和对路由器吞吐量进行测试 需要后台不断的接收来自udp服务器端的数据,同时要发送数据到服务器端(无线路由器) 设计时候,通过一个线程,for(;;)死循 ...
- C++ Code_animateCtrl
Code:: 播放 if (!m_animate1.Open("C:\\copy.avi")) { MessageBox("NULL& ...
- windows7添�windows2008R2域配置
server端配置: windows2008R2 WIN+R -> dcmopro -> 下一步 -> .... client配置: windows7 配置 DNS,如图: 计算机 ...
- 【转】android开源项目和框架
特效: http://www.androidviews.net/ http://www.theultimateandroidlibrary.com/ 常用效果: 1. https://github ...