对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操作MongoDB基础知识
Nov 01 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
Feb 18 Python
Python探索之pLSA实现代码
Oct 25 Python
Python+matplotlib实现华丽的文本框演示代码
Jan 22 Python
解决python3 网络请求路径包含中文的问题
May 10 Python
Python实现多线程的两种方式分析
Aug 29 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
tensorflow实现训练变量checkpoint的保存与读取
Feb 10 Python
Python greenlet和gevent使用代码示例解析
Apr 01 Python
Python实现AI换脸功能
Apr 10 Python
关于tensorflow softmax函数用法解析
Jun 30 Python
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
Jun 22 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
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
模拟OICQ的实现思路和核心程序(二)
2006/10/09 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
关于Javascript与iframe的那些事儿
2013/07/04 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
jQuery实现个性翻牌效果导航菜单的方法
2015/03/09 Javascript
JS实现从网页顶部掉下弹出层效果的方法
2015/08/06 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
需要牢记的JavaScript基础知识
2016/09/25 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
vue自定义指令的创建和使用方法实例分析
2018/12/04 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
2019/04/14 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
2019/06/24 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
[02:04]2016国际邀请赛中国区预选赛VG.R晋级之路
2016/07/01 DOTA
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
在Python的循环体中使用else语句的方法
2015/03/30 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
2017/09/11 Python
Python设计模式之中介模式简单示例
2018/01/09 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
python批量爬取下载抖音视频
2019/06/17 Python
python的range和linspace使用详解
2019/11/27 Python
浅析Python中字符串的intern机制
2020/10/03 Python
HTML5拖放功能_动力节点Java学院整理
2017/07/13 HTML / CSS
配件采购员岗位职责
2013/12/03 职场文书
工商管理专业自荐信
2014/06/03 职场文书
运动会致辞稿
2015/07/29 职场文书
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android
MySQL 条件查询的常用操作
2022/04/28 MySQL