对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备份Mysql脚本
Aug 11 Python
python共享引用(多个变量引用)示例代码
Dec 04 Python
python判断图片宽度和高度后删除图片的方法
May 22 Python
Python的Django框架中设置日期和字段可选的方法
Jul 17 Python
Python数据类型详解(一)字符串
May 08 Python
python数据结构之链表详解
Sep 12 Python
python cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 Python
Python中利用aiohttp制作异步爬虫及简单应用
Nov 29 Python
Python之循环结构
Jan 15 Python
Python shelve模块实现解析
Aug 28 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
May 11 Python
python基础之匿名函数详解
Apr 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中的日期处理方法集锦
2007/01/02 PHP
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
jquery 操作DOM案例代码分享
2012/04/05 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
使用jquery解析XML的方法
2014/09/05 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
javascript冒泡排序小结
2016/04/10 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
Javascript前端经典的面试题及答案
2017/03/14 Javascript
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
JavaScript实现文件下载并重命名代码实例
2019/12/12 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
Python 中字符串拼接的多种方法
2018/07/30 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
Python3爬虫ChromeDriver的安装实例
2021/02/06 Python
味多美官网:蛋糕订购,100%使用天然奶油
2017/11/10 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
职业生涯规划设计步骤
2014/01/12 职场文书
cf收人广告词
2014/03/14 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
机关作风建设心得体会
2014/10/22 职场文书
2014年技术部工作总结
2014/12/12 职场文书
先进班集体事迹材料
2014/12/25 职场文书
学生检讨书范文
2015/01/27 职场文书
党支部评议意见
2015/06/02 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
卖车协议书范文
2016/03/23 职场文书