装饰器

python学习之装饰器

随声附和 提交于 2021-01-09 12:38:29
在C/C++中,指针的运用是个高级的话题,我们可以使用指针随意操纵数据对象和内存地址。函数的入口其实也是一个内存地址,为了可以随意地调用函数,需要用到函数指针和回调函数的概念。python中没有指针一说,所有的对象(包括函数)都可以通过引用的方式进行调用。先看下面的例子 def foo(): print 'this foo()' bar=foo bar() this foo() 当我们把foo赋值给bar时,bar和foo其实引用了同一个函数对象,这是就可以以调用foo()的方式调用bar()了。不过需要注意的是,foo是函数对象的引用,而foo()是函数对象的调用。再看下面的例子 def foo(func): print 'this foo' return func def bar(): print 'this bar' bar=foo(bar) bar() this foo this bar 这种用法是不是让你想起了C/C++中的函数指针的用法,确实很像,实际上它也实现了类似的功能。闲话讲了很多,那么装饰器该正式登场了,其实装饰器的语法糖类似于 bar=foo(bar),只不过它简化了表现形式。 def foo(func): print 'this foo' return func @foo def bar(): print 'this bar' bar() bar()

react-redux中connect的装饰器用法@connect

怎甘沉沦 提交于 2020-03-18 17:20:35
3 月,跳不动了?>>>   最近在琢磨react中的一些小技巧,这篇文章记录一下在redux中用装饰器来写connect。   通常我们需要一个reducer和一个action,然后使用connect来包裹你的Component。假设你已经有一个key为main的reducer和一个action.js. 我们的App.js一般都这么写: import React from 'react' import {render} from 'react-dom' import {connect} from 'react-redux' import {bindActionCreators} from 'redux' import action from 'action.js' class App extends React.Component{ render(){ return <div>hello</div> } } function mapStateToProps(state){ return state.main } function mapDispatchToProps(dispatch){ return bindActionCreators(action,dispatch) } export default connect(mapStateToProps

Python装饰器学习

喜夏-厌秋 提交于 2020-03-01 11:52:38
第一步:最简单的函数,准备附加额外功能 # -*- coding:utf8 -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc(): print("myfunc() called.") myfunc() myfunc() 第二步:使用装饰函数在函数执行前和执行后分别附加额外功能 # -*- coding:utf8 -*- '''示例2: 替换函数(装饰) 装饰函数的参数是被装饰的函数对象,返回原函数对象 装饰的实质语句: myfunc = deco(myfunc)''' def deco(func): print("before myfunc() called.") func() print(" after myfunc() called.") return func def myfunc(): print(" myfunc() called.") myfunc = deco(myfunc) myfunc() myfunc() 第三步:使用语法糖@来装饰函数 # -*- coding:utf8 -*- '''示例3: 使用语法糖@来装饰函数,相当于“myfunc = deco(myfunc)” 但发现新函数只在第一次被调用,且原函数多调用了一次''' def deco(func): print("before myfunc() called.")

装饰器进阶

被刻印的时光 ゝ 提交于 2020-03-01 10:13:36
一:装饰器 在不改变原函数的基础上,额外的添加功能。 装饰器的返回值是一个函数对象。 装饰器应用:日志,性能测试,事务处理,缓存等场景。 二:装饰器形成过程 一个函数的应用:计算执行时间 import time def func1 () : print ( 'in func1' ) def timer ( func ) : def inner () : start_time = time.time() func() end_time = time.time() print (end_time - start_time) return inner func1 = timer(func1) func1() 多个函数的应用时候用func1 = timer(func1)太麻烦了,于是有了语法糖。 不带参数装饰器(简单装饰器) import time def timer ( func ) : def inner () : start = time.time() func() print (time.time() - start) return inner @timer #==> func1 = timer(func1) def func1 () : print ( 'in func1' ) func1() 万能装饰器(带参数的函数) def wrapper ( func ) : def

python 装饰器及标准库functools中的wraps

混江龙づ霸主 提交于 2020-01-07 18:23:35
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 最近在看 flask的视图装饰器 时,忽然想起预(复)习一下python的装饰器. 这里有一篇比较好的讲解装饰器的书写的 Python装饰器学习(九步入门) . 这里不单独记录装饰器的书写格式了,重点是工作流程. 首先常见的 装饰器 格式就是通过@语法糖,简便的写法,让流程有些不太清楚. 装饰器不带参数的情况下: def deco(func): def _deco(): print("before myfunc() called.") func() print(" after myfunc() called.") return _deco @deco def myfunc(): print(" myfunc() called.") myfunc() 运行结果: before myfunc() called. myfunc() called. after myfunc() called. myfunc() called. 这个@语法糖的作用是: def myfunc(): print(" myfunc() called.") myfunc = deco(myfunc) 也就是现在的myfunc不再是一开始定义的那个了,而变成了 def _deco(): print("before myfunc() called.

Python基础——装饰器、模块(0417)

故事扮演 提交于 2019-11-26 10:41:23
一、Python基础——复习 1、字符串的常用操作 2、列表的常用操作 3、字典的常用操作 二、Python——装饰器: 函数可以是变量 1、Python是一种面向对象的编程语言,在Python中所有的都可以是Python的对象。即可以在函数内创建函数—— 函数也可以是变量!(亦可称之为:内嵌函数) 2、如果内部函数引用了外部函数定义的对象(即某函数调用的是该函数以外定义的对象,但该对象不是全局变量),那么此时内部函数叫做: 闭包函数,所引用的外部变量叫:自由变量。 什么是闭包函数?——函数内部定义函数;并且引用了外部变量但不是全局变量。 3、Python装饰器 Python装饰器本质上是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器返回的值也是一个函数对象。 3.1 变量与引用示例: 结果: 3.2 装饰器示例一: 运行结果: 3.3 装饰器示例二: 步骤1:执行代码第一行 定义变量为author 的函数srartEnd(即函数srartEnd就是装饰器) 步骤2:获取变量 author 的值,即author的值为 Jsh 步骤3:获取到author的值后,执行函数srartEnd 步骤4:执行函数srartEnd的内容,即定义变量为 fun 的函数a 步骤5:返回函数a的值 步骤6:@符号是装饰器的语法糖,在定义函数的时候使用,避免再一次被赋值