对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使用cx_Oracle模块将oracle中数据导出到csv文件的方法
May 16 Python
在Django框架中编写Context处理器的方法
Jul 20 Python
利用Python破解验证码实例详解
Dec 08 Python
python中使用iterrows()对dataframe进行遍历的实例
Jun 09 Python
python中实现控制小数点位数的方法
Jan 24 Python
Python高级特性与几种函数的讲解
Mar 08 Python
python3射线法判断点是否在多边形内
Jun 28 Python
python hash每次调用结果不同的原因
Nov 21 Python
numpy的Fancy Indexing和array比较详解
Jun 11 Python
python解包用法详解
Feb 17 Python
python中pandas.read_csv()函数的深入讲解
Mar 29 Python
使用Django实现商城验证码模块的方法
Jun 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 adodb介绍
2009/03/19 PHP
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
解析php中获取url与物理路径的总结
2013/06/21 PHP
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
2015/10/08 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
jquery 元素控制(追加元素/追加内容)介绍及应用
2013/04/21 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
jQuery 插件封装的方法
2016/11/16 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
js 发布订阅模式的实例讲解
2017/09/10 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
Python的Bottle框架中实现最基本的get和post的方法的教程
2015/04/30 Python
python实现俄罗斯方块游戏
2020/03/25 Python
python中open函数的基本用法示例
2019/09/07 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
简单介绍HTML5中audio标签的使用
2015/09/24 HTML / CSS
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
中软国际Java程序员机试题
2012/08/19 面试题
爱心活动计划书
2014/04/26 职场文书
冬季施工防火方案
2014/05/17 职场文书
论文诚信承诺书
2014/05/23 职场文书
优秀少先队辅导员事迹材料
2014/12/24 职场文书
学术会议邀请函
2015/01/30 职场文书
MongoDB使用场景总结
2022/02/24 MongoDB
使用 Docker Compose 构建复杂的多容器App
2022/04/30 Servers