问答详情
源自:6-9 python中 __call__

大神看看这个错在哪?本人菜鸟

class Fib(object):

    def __init__(self,num):

        a,b,L=0,1,[]

        for i in range(num):

            L.append(a)

            a,b=b,a+b

            

        self.numbers=L

        

    def __str__(self):

        return str(self.numbers)

        

    __repr__=__str__

    

    def __call__(self,numb):

        return Fib(numb)

    


f = Fib()

print f(10)


答案上用call代替了init的位置,不需要初始化了吗?


提问者:培根熏肉 2016-07-01 17:48

个回答

  • 慕数据0495159
    2016-07-02 14:41:25
    已采纳

    # -*- coding:utf-8 -*-
    # 给你写个例子
    class Test(object):
        def __init__(self,name):
            print("我是构造函数,在实例化的时候会执行","传入的参数是:%s" % (name))
            self.name = name
        def __str__(self):
            return "输出对象,我是重写的__str__方法"
        def __call__(self,name):
            print("我是__call__方法,将返回一个可调用对象", "传入的参数是:%s" % (name))
            print("类中的name是:%s" % (self.name))
    test = Test('class')
    print(test)
    print("------------------")
    print(test('def __call__'))

    执行结果:

    我是构造函数,在实例化的时候会执行 传入的参数是:class
    输出对象,我是重写的__str__方法
    ------------------
    我是__call__方法,将返回一个可调用对象 传入的参数是:def __call__
    类中的name是:class
    None

    如果你细心,你会发现,最后一个self.name打印的结果是None,其实,__call__方法就是重写了“()”运算符,让返回的内容,具有了函数执行的能力,这个和原先的类没有关系。

  • 慕数据0495159
    2016-07-02 14:44:30

    上面写错了,打印的None,其实是__call__方法没有定义return 语句

  • 慕数据0495159
    2016-07-02 14:27:10

    其实你这样做,有点多此一举,Fib(10)本来就是实例化一个类的,他执行的是__init__方法,所以,在你的代码里__call__方法根本就没有执行,在print的时候,你又刚好实现了__str__方法,才让print f正确执行。其实__call__方法是这样的意思,如果你想把一个类像函数一样调用,可是实现__call__方法,在你实例化类之后  f = Fib(10),你实例化得到的其实是__call__方法的一个引用,他保存在 f 中,你就可以像__call__方法定义的那样,用f变量去调用__call__方法了。

  • 慕数据0495159
    2016-07-02 14:14:35

    最后一步有错,如下修改:

    f = Fib(10)

    print f