对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中使用Tkinter模块创建GUI程序实例
Jan 14 Python
Python基于pillow判断图片完整性的方法
Sep 18 Python
Python3简单实例计算同花的概率代码
Dec 06 Python
python之DataFrame实现excel合并单元格
Feb 22 Python
pycharm修改界面主题颜色的方法
Jan 17 Python
python实现杨氏矩阵查找
Mar 02 Python
Python实现最大子序和的方法示例
Jul 05 Python
python实现从本地摄像头和网络摄像头截取图片功能
Jul 11 Python
Windows系统Python直接调用C++ DLL的方法
Aug 01 Python
Django中FilePathField字段的用法
May 21 Python
Keras搭建自编码器操作
Jul 03 Python
用于ETL的Python数据转换工具详解
Jul 21 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 CURL获取返回值的方法
2014/05/04 PHP
PHP实现数组递归转义的方法
2014/08/28 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
JavaScript 代码压缩工具小结
2012/02/27 Javascript
js获取height和width的方法说明
2013/01/06 Javascript
如何在指定的地方插入html内容和文本内容
2013/12/23 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
JavaScript反弹动画效果的实现代码
2017/07/13 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
详解webpack4多入口、多页面项目构建案例
2018/05/25 Javascript
微信小程序scroll-view实现滚动穿透和阻止滚动的方法
2018/08/20 Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
2019/10/30 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
Python实现识别手写数字大纲
2018/01/29 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
Python处理PDF与CDF实例
2020/02/26 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
详解python polyscope库的安装和例程
2020/11/13 Python
html5手机端页面可以向右滑动导致样式受影响的问题
2018/06/20 HTML / CSS
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
优秀护士获奖感言
2014/02/20 职场文书
《故乡》教学反思
2014/04/10 职场文书
2016党员入党决心书
2015/09/22 职场文书
2016年三八节红领巾广播稿
2015/12/17 职场文书
MySQL快速插入一亿测试数据
2021/06/23 MySQL
SQL Server使用导出向导功能
2022/04/08 SQL Server