Python中的特殊方法:__call__
本文结构:
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__的更多相关文章
- Python中的__init__,__call__
__init__函数 当一个类实例被创建时, __init__() 方法会自动执行,在类实例创建完毕后执行,类似构建函数.__init__() 可以被当成构建函数,不过不象其它语言中的构建函数,它并不 ...
- Python中的__init__()和__call__()函数
Python中的__init__()和__call__()函数 在Python的class中有一些函数往往具有特殊的意义.__init__()和__call__()就是class很有用的两类特殊的函数 ...
- Python中的__new__()方法与实例化
@Python中的__new__()方法与实例化 __new__()是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在Python 中 存在于类里面的构造方法__init__ ...
- python中的replace()方法的使用
python中的replace()方法的使用 需求是这样的:需要将字符串的某些字符替换成其他字符 str.replace(old,new,max) 第一个参数是要进行更换的旧字符,第二个参数是新的子串 ...
- Python中的字符串方法
Python中的字符串方法 字符串类即str提供了许多有用的方法来操纵字符串.具体来说,我们将讨论如下的方法. 搜索字符串内的子字符串. 测试字符串. 格式字符串. 转换字符串. 回顾前面的章节,方法 ...
- python中的sort方法
Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明: 一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不 ...
- python中的sort方法使用详解
Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明: 一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不 ...
- Python中格式化format()方法详解
Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参 ...
- 关于python中的特殊方法
研究了几个小时,大概对python中的特殊方法一知半解,现在写写自己的理解,以及记录一些找到的资源.待自己有比较深入理解的时候,再来更新 https://docs.python.org/3/refer ...
- Python中使用item()方法遍历字典的例子
Python中使用item()方法遍历字典的例子 这篇文章主要介绍了Python中使用item()方法遍历字典的例子,for...in这种是Python中最常用的遍历字典的方法了,需要的朋友可以参考下 ...
随机推荐
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- NDK编译库执行时报dlopen failed: cannot locate symbol "__exidx_end" 解决的方法
当用NDK编译的库在执行载入时报例如以下错: dlopen("/data/data/xxx.xxx.xxx/lib/libxxx.so") failed: dlopen faile ...
- web 前端学习笔记
<!DOCTYPE HTML> <head> <style type="text/css"> body { background: #ff00 ...
- luogu1052 过河
题目大意 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- luogu1070 道路游戏 单调队列
题目大意 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 nn 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 nn 个机器人工 ...
- 阿里云 Docker-registry 搭建
阿里云 仓库地址: https://cr.console.aliyun.com/cn-hangzhou/instances/images
- Candies(差分约束系统)
http://poj.org/problem?id=3159 思路:用O(V+ElogV)的Dijkstra算法求1到n的最短路.即用优先队列优化Dijkstra算法. #include <st ...
- php的string编码类型
在php中字符编码转换我们一般会用到iconv与mb_convert_encoding进行操作,但是mb_convert_encoding在转换性能上比iconv要差很多哦.string iconv ...
- css3 文本模型
我前期是一名前端开发者,经常会遇到关于文本模型的问题,很多地方我们会经常遇到这种问题.例如栏目的标题,在设计师给我们图的时候并不会考虑到标题的长度,所以我们自己开发的过程中自己注意这一点. 首先和大家 ...
- 构造函数中this,return的详解
function Foo(name,age){ this.name=name; this.age=age; } var foo=new Foo("Tom",14); foo.nam ...