本文结构:

1.__call__方法

2.callable():判断对象/函数能否被调用

3.举例:斐波那契数列类

1.__call__方法

一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()来调用。

能不能直接在实例本身上调用呢?在Python中,答案是肯定的。

任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用.

看一个例子:

class Student(object):
def __init__(self,score):
self.score=score
def __call__(self):
return self.score tim=Student(80)
tim() ##result
80

__call__大大模糊了对象和函数的边界,因为对象居然也可以调用了!

2.callable():判断对象/函数能否被调用

那么如何判断一个对象或函数能否被调用呢?可以用callable()

print callable(tim)
print callable(sum)
print callable('ABC') ##result
True
True
False

3.举例:斐波那契数列类

最后,用一个斐波那契数列类来实现一下直接调用对象。

下面这段代码定义了一个Fib类,通过将Fib类实例化创建了一个迭代器对象。

通过调用next方法,能够迭代打印数列的值。

class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化两个计数器a,b def __iter__(self):
return self # 实例本身就是迭代对象,故返回自己 '''在python2中是next,在python3中是__next__'''
def next(self):
self.a, self.b = self.b, self.a + self.b # 计算下一个值
if self.a > 50: # 退出循环的条件
raise StopIteration()
return self.a# 返回下一个值
if __name__=='__main__':
test=Fib()
print test.next()
print test.next()
print test.next()
print test.next()
print test.next() ##result
1
1
2
3
5

如果觉得每次都调用next方法太过麻烦,能不能直接调用实例对象?

当然可以,只需要借助一下闭包的性质即可:

class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化两个计数器a,b def __iter__(self):
return self # 实例本身就是迭代对象,故返回自己 '''在python2中是next,在python3中是__next__'''
def __call__(self):
def next(self):
self.a, self.b = self.b, self.a + self.b # 计算下一个值
if self.a > 50: # 退出循环的条件
raise StopIteration()
return self.a# 返回下一个值
return next(self)
if __name__=='__main__':
test=Fib()
for i in range(5):
print test() ##result
1
1
2
3
5

Python中的特殊方法:__call__的更多相关文章

  1. Python中的__init__,__call__

    __init__函数 当一个类实例被创建时, __init__() 方法会自动执行,在类实例创建完毕后执行,类似构建函数.__init__() 可以被当成构建函数,不过不象其它语言中的构建函数,它并不 ...

  2. Python中的__init__()和__call__()函数

    Python中的__init__()和__call__()函数 在Python的class中有一些函数往往具有特殊的意义.__init__()和__call__()就是class很有用的两类特殊的函数 ...

  3. Python中的__new__()方法与实例化

    @Python中的__new__()方法与实例化   __new__()是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在Python 中 存在于类里面的构造方法__init__ ...

  4. python中的replace()方法的使用

    python中的replace()方法的使用 需求是这样的:需要将字符串的某些字符替换成其他字符 str.replace(old,new,max) 第一个参数是要进行更换的旧字符,第二个参数是新的子串 ...

  5. Python中的字符串方法

    Python中的字符串方法 字符串类即str提供了许多有用的方法来操纵字符串.具体来说,我们将讨论如下的方法. 搜索字符串内的子字符串. 测试字符串. 格式字符串. 转换字符串. 回顾前面的章节,方法 ...

  6. python中的sort方法

    Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明: 一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不 ...

  7. python中的sort方法使用详解

    Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明: 一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不 ...

  8. Python中格式化format()方法详解

    Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参 ...

  9. 关于python中的特殊方法

    研究了几个小时,大概对python中的特殊方法一知半解,现在写写自己的理解,以及记录一些找到的资源.待自己有比较深入理解的时候,再来更新 https://docs.python.org/3/refer ...

  10. Python中使用item()方法遍历字典的例子

    Python中使用item()方法遍历字典的例子 这篇文章主要介绍了Python中使用item()方法遍历字典的例子,for...in这种是Python中最常用的遍历字典的方法了,需要的朋友可以参考下 ...

随机推荐

  1. grails一对多双向关联

    前面分享了一些学习grails的心得,可是grails的知识还远不止这些,这次整理了一点有关grails一对多双向关联关系的知识.我认为这样的关联用的地方太多了,这次准备的样例是城市和区域的相关样例. ...

  2. linux下查看监听port相应的进程

    使用netstat查看进程PID [root@test ~]# netstat -anp|grep 5001 tcp 0 0 :::5001 :::* LISTEN 12886/java 之后各位看官 ...

  3. CF 557A(Ilya and Diplomas-贪心)

    A. Ilya and Diplomas time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. 【HDOJ 5419】 Victor and Toys (排列组合)

    [HDOJ 5419] Victor and Toys n个玩具 m个区间 每一个玩具有一个beauty值 问任选三个区间 三区间的MINleft~MAXright的和的期望值 预处理一个数组 存放每 ...

  5. iOS 图像处理 - 图像拼接

    解决这个问题:将两个图像拼接在一起 前提:须要加入Framework:CoreGraphics.framework 源代码: - (UIImage *) combine:(UIImage*)leftI ...

  6. WINDOWS下配置SVN代码管理

    服务器端使用 visualsvn server,客户端使用tortoiseSvn. 一.服务器端 1.首先,下载visualsvn server,安装到服务器.下载地址: http://www.vis ...

  7. 二分图染色模板(P1330 封锁阳光大学)

    二分图染色模板(P1330 封锁阳光大学) 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校 ...

  8. [Apple开发者帐户帮助]六、配置应用服务(4)创建MusicKit标识符和私钥

    要与Apple Music服务进行通信,您将使用MusicKit私钥对一个或多个开发人员令牌进行签名. 首先注册音乐标识符以识别您的应用.为使用Apple Music API的每个应用注册音乐标识符. ...

  9. Element-UI 笔记

    1.表单验证 官官方地址 :     https://element.eleme.cn/#/zh-CN/component/form 使用rules进行表单字段验证  https://blog.csd ...

  10. Springboot+hibernate简单的增删改查

    1.创建好项目之后在配置端口号(也可以不用配置,默认端口8080) #server server.port= server.tomcat.uri-encoding=utf- 2.配置mysql #My ...