为了账号安全,请及时绑定邮箱和手机立即绑定

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

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 回答

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

3 回复 有任何疑惑可以回复我~
#1

培根熏肉 提问者

很详细,受教了
2016-07-03 回复 有任何疑惑可以回复我~
#2

艾小科

self.name打印的是class不是么?这句话每太明白"如果你细心,你会发现,最后一个self.name打印的结果是None,其实,__call__方法就是重写了“()”运算符,让返回的内容,具有了函数执行的能力,这个和原先的类没有关系。"
2016-08-30 回复 有任何疑惑可以回复我~
#3

艾小科

看到你下面的回复了。感觉楼主的“答案上用call代替了init的位置,不需要初始化了吗?”没有回答啊
2016-08-30 回复 有任何疑惑可以回复我~
#4

Peter_J3960133

最后返回None是因为__call__没有设定return,所以没有返回值,显示就是None了。
2017-04-13 回复 有任何疑惑可以回复我~
#5

余先生2 回复 艾小科

我的理解是__call__并没有替代__init__的位置,没有写__init__系统会自动调用默认的__init__。
2018-02-17 回复 有任何疑惑可以回复我~
查看2条回复

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

0 回复 有任何疑惑可以回复我~
#1

Peter_J3960133

正解!
2017-04-13 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

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

f = Fib(10)

print f


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

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

进入课程

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信