对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的dict,set,list,tuple应用详解
Jul 24 Python
跟老齐学Python之大话题小函数(2)
Oct 10 Python
Python可变参数函数用法实例
Jul 07 Python
Python实现提取谷歌音乐搜索结果的方法
Jul 10 Python
Python之日期与时间处理模块(date和datetime)
Feb 16 Python
Python利用Beautiful Soup模块搜索内容详解
Mar 29 Python
python 系统调用的实例详解
Jul 11 Python
python调用百度语音识别实现大音频文件语音识别功能
Aug 30 Python
Python中fnmatch模块的使用详情
Nov 30 Python
Python学习笔记之迭代器和生成器用法实例详解
Aug 08 Python
Python3 解决读取中文文件txt编码的问题
Dec 20 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
Feb 02 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中uploaded_files函数使用方法详解
2011/03/09 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
php中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
PHP实现根据数组的值进行分组的方法
2017/04/20 PHP
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
javascript 获取图片尺寸及放大图片
2013/09/04 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
js实现圆盘记速表
2015/08/03 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
2017/04/18 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
vuex 使用文档小结篇
2018/01/11 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
javascript执行上下文、变量对象实例分析
2020/04/25 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
OpenCV实现人脸识别
2017/04/07 Python
django连接oracle时setting 配置方法
2019/08/29 Python
python tkinter控件布局项目实例
2019/11/04 Python
一款CSS3实现多功能下拉菜单(带分享按)的教程
2014/11/05 HTML / CSS
什么是Remote Module
2016/06/10 面试题
单位创先争优活动方案
2014/01/26 职场文书
爱国主义教育演讲稿
2014/08/26 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
总经理年会致辞
2015/07/29 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
pygame面向对象的飞行小鸟实现(Flappy bird)
2021/04/01 Python
Windows下用Nginx配置https服务器及反向代理的问题
2021/09/25 Servers