对python特殊函数 __call__()的使用详解


Posted in Python onJuly 02, 2019

__call__

在Python中,函数其实是一个对象:

>>> f = abs
>>> f.__name__
'abs'
>>> f(-123)

由于 f 可以被调用,所以,f 被称为可调用对象。

所有的函数都是可调用对象。

一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。

我们把 Person 类变成一个可调用对象:

class Person(object):
  def __init__(self, name, gender):
    self.name = name
    self.gender = gender

  def __call__(self, friend):
    print 'My name is %s...' % self.name
    print 'My friend is %s...' % friend

现在可以对 Person 实例直接调用:

>>> p = Person('Bob', 'male')
>>> p('Tim')
My name is Bob...
My friend is Tim...

单看 p('Tim') 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。

任务

改进一下前面定义的斐波那契数列:

class Fib(object):
  ???

请加一个__call__方法,让调用更简单:

>>> f = Fib()
>>> print f(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

可以把实例对象用类似函数的形式表示,进一步模糊了函数和对象之间的概念

class Fib(object):
  def __init__(self):
    pass
  def __call__(self,num):
    a,b = 0,1;
    self.l=[]
    
    for i in range (num):
      self.l.append(a)
      a,b= b,a+b
    return self.l
  def __str__(self):
    return str(self.l)
  __rept__=__str__
      
f = Fib()
print f(10)

以上这篇对python特殊函数 __call__()的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python根据出生日期返回年龄的方法
Mar 26 Python
Python数据类型学习笔记
Jan 13 Python
解析Python中的生成器及其与迭代器的差异
Jun 20 Python
Python面向对象程序设计之继承与多继承用法分析
Jul 13 Python
详解Python中的type和object
Aug 15 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 Python
flask框架路由常用定义方式总结
Jul 23 Python
python异常处理try except过程解析
Feb 03 Python
Python QTimer实现多线程及QSS应用过程解析
Jul 11 Python
python用Configobj模块读取配置文件
Sep 26 Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 Python
OpenCV实现常见的四种图像几何变换
Apr 01 Python
对python 调用类属性的方法详解
Jul 02 #Python
python算法题 链表反转详解
Jul 02 #Python
python输入多行字符串的方法总结
Jul 02 #Python
Django高级编程之自定义Field实现多语言
Jul 02 #Python
python 杀死自身进程的实现方法
Jul 01 #Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 #Python
PyCharm-错误-找不到指定文件python.exe的解决方法
Jul 01 #Python
You might like
PHP三元运算的2种写法代码实例
2014/05/12 PHP
php实现的顺序线性表示例
2019/05/04 PHP
动态加载js文件 document.createElement
2006/10/14 Javascript
用jscript启动sqlserver
2007/06/21 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
js选取多个或单个元素的实现代码(用class)
2012/08/22 Javascript
基于jQuery实现模拟页面加载进度条
2013/04/01 Javascript
Js获取数组最大和最小值示例代码
2013/10/29 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
JavaScript从0开始构思表情插件
2016/07/26 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
localstorage实现带过期时间的缓存功能
2019/06/28 Javascript
解决vue项目F5刷新mounted里的函数不执行问题
2019/11/05 Javascript
jquery实现进度条状态展示
2020/03/26 jQuery
深入分析jQuery.one() 函数
2020/06/03 jQuery
js实现炫酷光感效果
2020/09/05 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
python 实现敏感词过滤的方法
2019/01/21 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
python3 sorted 如何实现自定义排序标准
2020/03/12 Python
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
家长学校实施方案
2014/03/15 职场文书
运动会新闻报道稿
2015/07/22 职场文书
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
2022/05/30 NodeJs