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

原文链接:https://blog.csdn.net/u010339879/article/details/80588403

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值