python的高级特性3:神奇的__call__与返回函数
__call__是一个很神奇的特性,只要某个类型中有__call__方法,,我们可以把这个类型的对象当作函数来使用。
也许说的比较抽象,举个例子就会明白。
In [107]: f = abs In [108]: f(-10)
Out[108]: 10 In [109]: dir(f)
Out[109]:
['__call__',
'__class__',
'__delattr__',
'__dir__',
...]
上例中的f对象指向了abs类型,由于f对象中有__call__方法,因此f(-10)实现了对abs(-10)的重载。
ps:由于变量/对象/实例可以指向函数,而函数能够接受变量,因此可以看出函数可以接受另一个函数作为参数,所以__call__就实现装饰器的基础。
扩展部分:返回函数
函数或类一般有返回值,而python中有一个神奇的特性就是返回函数。
In [134]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:
:def lazy_sum(*args):
: def sum():
: ax = 0
: for n in args:
: ax = ax + n
: return ax
: return sum
:-- In [135]: f = lazy_sum(1,3,5,7,9) In [136]: f
Out[136]: <function __main__.lazy_sum.<locals>.sum> In [137]: f()
Out[137]: 25
为什么返回函数能够这么神奇,咱们一探究竟。
In [138]: dir(f)
Out[138]:
['__annotations__',
'__call__',
'__class__',
...
'__getattribute__',
...
'__setattr__',
]
查看一下type,真相打败,原来是因为f里有__call__的内建方法。
python的高级特性3:神奇的__call__与返回函数的更多相关文章
- Python的高级特性7:闭包和装饰器
本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...
- Python的高级特性8:你真的了解类,对象,实例,方法吗
Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...
- python的高级特性:切片,迭代,列表生成式,生成器,迭代器
python的高级特性:切片,迭代,列表生成式,生成器,迭代器 #演示切片 k="abcdefghijklmnopqrstuvwxyz" #取前5个元素 k[0:5] k[:5] ...
- Python的高级特性(切片,迭代,生成器,迭代器)
掌握了python的数据类型,语句和函数,基本上就可以编出很多有用的程序了. 但是在python中,并不是代码越多越好,代码不是越复杂越好,而是越简单越好. 基于这个思想,就引申出python的一些高 ...
- Learning Python 011 高级特性 2
Python 高级特性 2 列表生成式 列表生成式就是指类似这样的代码:[x for x in range(1, 11)] >>> L = [x for x in range(1, ...
- Learning Python 011 高级特性 1
Python 高级特性 1 切片 将L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']列表中前上个3个元素: L = ['Michael', 'Sarah ...
- 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数
Scala高级特性 1. 课程目标 1.1. 目标一:深入理解高阶函数 1.2. 目标二:深入理解隐式转换 2. 高阶函数 2.1. 概念 Scala混合了面向对象和函数式的特 ...
- Python学习札记(二十四) 函数式编程5 返回函数
参考:返回函数 NOTE 1.高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. eg.求和函数 #!/usr/bin/env python3 def calsums(*args): a ...
- Python的高级特性11:拓展基本数据类型(dict)
字典的创建有两种方式,如果出现In [26]这样的赋值方式就会报错. In [17]: s['name'] = 'alex' In [18]: s['sex'] = 'male' In [19]: s ...
随机推荐
- Android忘记密码功能实现
连续好几天学习都没有什么进展,然而在今天这个烂漫的日子.突然有了学习的动力.想起来前几日老师给布置的android忘记密码的功能实现.今天也有了想法.就是按照老师的建议,简单的回答一个问题,实现此功能 ...
- Android NDK编译本地文件以及引用第三方so文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_LDLIBS :=-llog LOCAL_MODULE := DeviceAPI LO ...
- Android ANR产生的原理和如何避免
在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框.用户可以选择 ...
- android am命令以及hotkey文件的编写
1.拨打电话:am start -a android.intent.action.CALL -d tel:10086 这里-a表示动作,-d表述传入的数据,还有-t表示传入的类型. 2. 打开一个网页 ...
- 新萝卜家园GHOST WIN7系统32,64位极速装机特别版
系统来自:系统妈:http://www.xitongma.com 新萝卜家园GHOST win7系统32位极速装机特别版 V2016年3月 系统概述 新萝卜家园ghost win7系统32位极速装机特 ...
- OC字符串NSString
========================== 面向对象编程进阶和字符串 ========================== Δ一.类的设计模式—单例 [单例]程序允许过程中,有且仅有一块内存 ...
- XMLA连接器--免费但不开源通过ODBO、XMLA
XMLA 连接器(驱动) :来自ARQUERY http://jaist.dl.sourceforge.net/project/xmlaconnect/XMLA_Provider_v1.0.0.1 ...
- HashSet vs TreeSet vs LinkedHashSet
使用Set集合的主要原因是因为Set集合里面没有重复的元素.Set集合有三个常见的实现类:HashSet,TreeSet,LinkedHashSet.什么时候,选择哪一个使用非常重要.简单的说,如果你 ...
- 十五天精通WCF——第十天 学会用SvcConfigEditor来简化配置
我们在玩wcf项目的时候,都是自己手工编写system.serviceModel下面的配置,虽然在webconfig中做wcf的服务配置的时候,vs提供大多 数的代码提示,但对于不太熟悉服务配置的小鸟 ...
- CentOS 6.5 生产环境编译安装LNMP
一.环境准备 1.操作系统安装:CentOS 6.5 64位最小化安装. 2.配置好IP.DNS.网关.主机名 3.配置防火墙,开启80.3306端口 vim /etc/sysconfig/iptab ...