python 中 __call__简单介绍

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__即可.

分享快乐,留住感动. 2018-06-05 22:35:21 --frank

你可能感兴趣的:(python基础&进阶,__call__方法)