在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))
请验证,完成请求
由于请求次数过多,请先验证,完成再次请求
打开微信扫码自动绑定
绑定后可得到
使用 Ctrl+D 可将课程添加到书签
举报