python 中 __call__
简单介绍
Python中有一个有趣的语法,只要定义类型的时候,实现__call__函数,这个类型就成为可调用的。 换句话说,我们可以把这个类型的对象当作函数来使用,相当于 重载了括号运算符。我们可以 实例对象()
1 来看下例子
class TestCall(object):
def __init__(self, name):
self.name = name
def __call__(self, *args, **kwargs):
print("self.name: %s. " % self.name, end=' ')
print('__call__() is running ')
if __name__ == '__main__':
call = TestCall(name='xiaoming')
call() # call.__call__()
call.__call__()
结果如下
self.name: xiaoming. __call__() is running
self.name: xiaoming. __call__() is running
# call() 就等价于 call.__call()__ 这样的调用
2 . 来看一下这个小例子
class Fib(object):
def __call__(self, num, *args, **kwargs):
n, m, lst = 0, 1, []
for i in range(num):
lst.append(n)
n, m = m, n + m
return lst
f = Fib()
print(f(10))
结果如下
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
3 在库函数里面找到一个模块 site.py
class Quitter(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return 'Use %s() or to exit' % (self.name,)
def __call__(self, code=None):
# Shells like IDLE catch the SystemExit, but listen when their
# stdin wrapper is closed.
try:
sys.stdin.close()
except:
pass
raise SystemExit(code)
quitter = Quitter('quit')
quitter(5)
结果如下
Process finished with exit code 5
总结
<center style="color:rgb(36,41,46);font-family:'-apple-system', BlinkMacSystemFont, '微软雅黑', 'PingFang SC', Helvetica, Tahoma, Arial, 'Hiragino Sans GB', 'Microsoft YaHei', SimSun, '宋体', Heiti, '黑体', sans-serif;font-size:14px;margin-bottom:0px;"> 分享快乐,留住感动. 2018-06-05 22:35:21 --frank </center>当一个类型实现了特殊方法
__call__
,该类的实例就变成了可调用的类型, 对象名() 等价于 对象名.__call__()
,有时候可以简化对象的调用,让对象变成可调用的对象, 实现__call__即可.