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
总结

当一个类型实现了特殊方法__call__,该类的实例就变成了可调用的类型, 对象名() 等价于 对象名.__call__() ,有时候可以简化对象的调用,让对象变成可调用的对象, 实现__call__即可.

<center style="color&#58;rgb&#40;36&#44;41&#44;46&#41;&#59;font&#45;family&#58;&#39;&#45;apple&#45;system&#39;&#44; BlinkMacSystemFont&#44; &#39;微软雅黑&#39;&#44; &#39;PingFang SC&#39;&#44; Helvetica&#44; Tahoma&#44; Arial&#44; &#39;Hiragino Sans GB&#39;&#44; &#39;Microsoft YaHei&#39;&#44; SimSun&#44; &#39;宋体&#39;&#44; Heiti&#44; &#39;黑体&#39;&#44; sans&#45;serif&#59;font&#45;size&#58;14px&#59;margin&#45;bottom&#58;0px&#59;"> 分享快乐,留住感动. 2018-06-05 22:35:21 --frank </center>