对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中global语句下全局变量的值的修改
Jun 16 Python
Go/Python/Erlang编程语言对比分析及示例代码
Apr 23 Python
Python使用re模块实现信息筛选的方法
Apr 29 Python
python使用matplotlib绘制热图
Nov 07 Python
Python实现图片转字符画的代码实例
Feb 22 Python
python实现截取屏幕保存文件,删除N天前截图的例子
Aug 27 Python
python turtle 绘制太极图的实例
Dec 18 Python
Python常见反爬虫机制解决方案
Jun 01 Python
Python列表元素删除和remove()方法详解
Jan 04 Python
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
Apr 25 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 14 Python
OpenCV-Python 实现两张图片自动拼接成全景图
Jun 11 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初学者头疼问题总结
2006/10/09 PHP
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
2013/06/05 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
Laravel配合jwt使用的方法实例
2020/10/25 PHP
javascript控制图片播放的实现代码
2020/07/29 Javascript
jquery mobile开发常见问题分析
2016/01/21 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
jQuery实现轮播图及其原理详解
2020/04/12 jQuery
详解多页应用 Webpack4 配置优化与踩坑记录
2018/10/16 Javascript
利用React Router4实现的服务端直出渲染(SSR)
2019/01/07 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
Python双向循环链表实现方法分析
2018/07/30 Python
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
python 2.7 检测一个网页是否能正常访问的方法
2018/12/26 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
Django对models里的objects的使用详解
2019/08/17 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
东方电视购物:东方CJ
2016/10/12 全球购物
美国伴娘礼服商店:Evening Collective
2019/10/07 全球购物
业务员岗位职责范本
2013/12/15 职场文书
房地产广告词大全
2014/03/19 职场文书
竞争上岗演讲稿范文
2014/05/12 职场文书
房屋分割离婚协议书范本
2014/12/01 职场文书
工会工作个人总结
2015/03/03 职场文书
亮剑精神观后感
2015/06/05 职场文书
治理商业贿赂工作总结
2015/08/10 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js
Python循环之while无限迭代
2022/04/30 Python
java开发双人五子棋游戏
2022/05/06 Java/Android