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

来源:6-9 python中 __call__

培根熏肉

2016-07-01 17:48

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的位置,不需要初始化了吗?


写回答 关注

4回答

  • 慕数据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__方法就是重写了“()”运算符,让返回的内容,具有了函数执行的能力,这个和原先的类没有关系。

    余先生2 回复艾小科

    我的理解是__call__并没有替代__init__的位置,没有写__init__系统会自动调用默认的__init__。

    2018-02-17 16:40:29

    共 5 条回复 >

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

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

    Peter_...

    正解!

    2017-04-13 10:08:36

    共 1 条回复 >

  • 慕数据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


python进阶

学习函数式、模块和面向对象编程,掌握Python高级程序设计

255495 学习 · 3038 问题

查看课程