码迷,mamicode.com
首页 > 编程语言 > 详细

对于Python中的__call__理解

时间:2015-05-02 20:51:52      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

在看源码的时候看到__call__不是很明白原理,所以在这里记录下

通常来说__call__的调用时实例后面的"()"引起的他自身的调用,但是如果只是将一个类复制给一个变量,调用的时候就有可能出现错误

比如:

class Test:
    List = []

    def __init__(self, low, high):
        for Num in range(low, high):
            self.List.append(Num ** 2)

    def __call__(self, Nu):
        return self.List[Nu]

if __name__ == "__main__":
    b = Test(1, 7)
    print b.List
    print b(2)

这样在b(2)的时候回调用__call__

这里可以看下

技术分享

这里调用b(2)的时候进入的是__call__.

但是如果是这样的代码:

class Test:
    List = []

    def __init__(self, low, high):
        for Num in range(low, high):
            self.List.append(Num ** 2)

    def __call__(self, Nu):
        return self.List[Nu]

if __name__ == "__main__":
    b = Test
    b(1,7)
    print b.List
    print b(2)

这段代码,先给出结果:

[1, 4, 9, 16, 25, 36]


Traceback (most recent call last):

  File "C:\Users\wangchunhui\Desktop\test.py", line 15, in <module>

    print b(2)

TypeError: __init__() takes exactly 3 arguments (2 given)

很明显,这里是把一个类赋个了一个变量,但是在b(2)的时候就相当于Test(2),可是在__init__却需要3个参数,这里只有2个,自然报错。

对于Python中的__call__理解

标签:

原文地址:http://my.oschina.net/u/1450570/blog/409102

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!