对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使用multiprocessing创建进程的方法
Jun 04 Python
Python多进程机制实例详解
Jul 02 Python
python实现二维码扫码自动登录淘宝
Dec 27 Python
在cmd命令行里进入和退出Python程序的方法
May 12 Python
Python3模拟curl发送post请求操作示例
May 03 Python
Django3.0 异步通信初体验(小结)
Dec 04 Python
Python Sympy计算梯度、散度和旋度的实例
Dec 06 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
Dec 19 Python
python 读取更新中的log 或其它文本方式
Dec 24 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
django model通过字典更新数据实例
Apr 01 Python
python3中calendar返回某一时间点实例讲解
Nov 18 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 网页过期时间的控制代码
2009/06/29 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
执行iframe中的javascript方法
2008/10/07 Javascript
JavaScript创建类/对象的几种方式概述及实例
2013/05/06 Javascript
浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
2014/05/11 Javascript
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
2015/02/27 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
小白谈谈对JS原型链的理解
2016/05/03 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
JQuery 实现文件下载的常用方法分析
2019/10/29 jQuery
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
Python实现list反转实例汇总
2014/11/11 Python
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
python实现计算倒数的方法
2015/07/11 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
Python面向对象进阶学习
2019/05/21 Python
Python-openCV开运算实例
2020/07/05 Python
Python3爬虫ChromeDriver的安装实例
2021/02/06 Python
解除劳动合同协议书(样本)
2014/10/02 职场文书
部队个人年终总结
2015/03/02 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
《刷子李》教学反思
2016/02/20 职场文书
入党转正申请书范文
2019/05/20 职场文书
2019幼儿园感恩节活动策划书
2019/11/28 职场文书
MySQL优化及索引解析
2022/03/17 MySQL