章节
问答
课签
笔记
评论
占位
占位

Python类的__call__方法

在Python中,函数其实是一个对象,我们可以将一个函数赋值给一个变量,而不改变函数的功能。

>>> f = abs
>>> f
<built-in function abs>
>>> abs
<built-in function abs>
>>> f.__name__
'abs'
>>> f(-123)
123

把内建函数abs()赋值给变量f之后,可以看到f就和abs一样,都是。
由于 f 可以被调用,所以,f 被称为可调用对象,而事实上,所有的函数都是可调用对象。
如果把一个类实例也变成一个可调用对象,可以实现一个特殊的方法__call__()。
例如,我们把Person类变成一个可调用对象:

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

    def __call__(self, friend):
        print('My name is {}...'.format(self.name))
        print('My friend is {}...'.format(friend))

接着我们初始化一个Person对象,并对这个对象通过函数的方式调用:

>>> p = Person('Bob', 'Male')
>>> p('Alice') # ==> 用函数的方式调用Person类的实例p
My name is Bob...
My friend is Alice...

任务

请实现前面介绍过的斐波那契数列类Fib,加入__call__方法,使得调用的方式如下简单。

>>> f = Fib()
>>> print f(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
?不会了怎么办

参考答案:

class Fib(object):
    def __init__(self):
        self.res = []

    def __call__(self, num):
        a = 0
        b = 1
        for x in range(num):
            self.res.append(a)
            a, b = b, a + b
        return self.res

f = Fib()
print(f(10))
||
1
2
# Enter a code
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
提交
重置代码
||

请验证,完成请求

由于请求次数过多,请先验证,完成再次请求

加群二维码

打开微信扫码自动绑定

您还未绑定服务号

绑定后可得到

  • · 粉丝专属优惠福利
  • · 大咖直播交流干货
  • · 课程更新,问题答复提醒
  • · 账号支付安全提醒

收藏课程后,能更快找到我哦~

使用 Ctrl+D 可将课程添加到书签

邀请您关注公众号
关注后,及时获悉本课程动态

举报

0/150
提交
取消
全部 精华 我要发布

最赞回答 / MrQinJS
执行最后有一个None,是因为python函数使用return返回值,如果不用return, 而用print输出值,这个函数默认还有一个返回值为None . 

最赞回答 / 花鸿
简单来说
p('Alice') 是p.__call__('Alice')的缩写。

最赞回答 / weixin_宝慕林6309633
result,建一个空的list来储存结果

最赞回答 / mr丿vincent
我理解是一个语法糖,把一个方法调用简化成能直接调用了,隐式调用。和JS中的语法类似

已采纳回答 / 慕侠6748888
有啊!
 print('My friend is {}...'.format())
 format后面跟了friend啊

最新回答 / weixin_慕妹7068926
抛出异常应该是try吧

最新回答 / weixin_慕妹7068926
__call__就是将这个对象可以像函数一样被调用
全部 我要发布
最热 最新
只看我的

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?

账号登录 验证码登录

遇到问题
忘记密码

代码语言