对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 相关文章推荐
linux系统使用python监测系统负载脚本分享
Jan 15 Python
详解Python中的多线程编程
Apr 09 Python
python基于socket实现网络广播的方法
Apr 29 Python
Python实现多线程抓取网页功能实例详解
Jun 08 Python
python实现最长公共子序列
May 22 Python
对python的文件内注释 help注释方法
May 23 Python
Python设置在shell脚本中自动补全功能的方法
Jun 25 Python
python 实现return返回多个值
Nov 19 Python
利用setuptools打包python程序的方法步骤
Jan 18 Python
PyCharm无法引用自身项目解决方式
Feb 12 Python
TensorFlow的reshape操作 tf.reshape的实现
Apr 19 Python
Pandas自定义选项option设置
Jul 25 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查询数据库中满足条件的记录条数(两种实现方法)
2013/01/29 PHP
深入phpMyAdmin的安装与配置的详细步骤
2013/05/07 PHP
php调用c接口无错版介绍
2014/03/11 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
js清空表单数据的两种方式(遍历+reset)
2014/07/18 Javascript
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
JavaScript动态创建div等元素实例讲解
2016/01/06 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
js实现增加数字显示的环形进度条效果
2017/02/05 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
[44:43]完美世界DOTA2联赛决赛日 FTD vs GXR 第一场 11.08
2020/11/11 DOTA
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
python 不关闭控制台的实现方法
2011/10/23 Python
django的ORM操作 删除和编辑实现详解
2019/07/24 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
对python中UDP,socket的使用详解
2019/08/22 Python
在Python中等距取出一个数组其中n个数的实现方式
2019/11/27 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
2020/06/17 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
HTML5中的新元素介绍
2008/10/17 HTML / CSS
html5实现输入框fixed定位在屏幕最底部兼容性
2020/07/03 HTML / CSS
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
Fanatics官网:运动服装、球衣、运动装备
2020/10/12 全球购物
清明节网上祭英烈活动总结
2014/04/30 职场文书
留学经费担保书
2014/05/12 职场文书
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
个人自我鉴定怎么写?
2019/07/01 职场文书
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL
利用JavaScript写一个简单计算器
2021/11/27 Javascript
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle