对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 多线程实现检测服务器在线情况
Nov 25 Python
python3利用tcp实现文件夹远程传输
Jul 28 Python
使用Python处理BAM的方法
Sep 28 Python
在Python中COM口的调用方法
Jul 03 Python
python3 线性回归验证方法
Jul 09 Python
python 叠加等边三角形的绘制的实现
Aug 14 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
jupyter notebook 实现matplotlib图动态刷新
Apr 22 Python
tensorflow实现从.ckpt文件中读取任意变量
May 26 Python
Django解决frame拒绝问题的方法
Dec 18 Python
Matlab如何实现矩阵复制扩充
Jun 02 Python
Python编程super应用场景及示例解析
Oct 05 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 JSON格式数据交互实例代码详解
2011/01/13 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
php实现每日签到功能
2018/11/29 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
JS左右无缝滚动(一般方法+面向对象方法)
2012/08/17 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
javascript实现input file上传图片预览效果
2015/12/31 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
2017/12/22 Javascript
解决Vue.js父组件$on无法监听子组件$emit触发事件的问题
2018/09/12 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
Python random模块常用方法
2014/11/03 Python
pygame学习笔记(5):游戏精灵
2015/04/15 Python
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
python实现树形打印目录结构
2018/03/29 Python
python使用turtle绘制分形树
2018/06/22 Python
Python英文文本分词(无空格)模块wordninja的使用实例
2019/02/20 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
flask框架中的cookie和session使用
2021/01/31 Python
平面设计自荐信
2013/10/07 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
2015年人事工作总结范文
2015/04/09 职场文书
李强优秀员工观后感
2015/06/16 职场文书
护士旷工检讨书
2015/08/15 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书
python四种出行路线规划的实现
2021/06/23 Python
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android
基于Python编写一个监控CPU的应用系统
2022/06/25 Python