python--__call__,,__call__在P


__call__

在Python中,函数其实是一个对象:

>>> f = abs>>> f.__name__‘abs‘>>> f(-123)123

由于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 %s...‘ % self.name        print ‘My friend is %s...‘ % friend

现在可以对Person实例直接调用:

>>> p = Person(‘Bob‘, ‘male‘)>>> p(‘Tim‘)My name is Bob...My friend is Tim...

单看p(‘Tim‘)你无法确定p是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。

任务

改进一下前面定义的斐波那契数列:

class Fib(object):    ???

请加一个__call__方法,让调用更简单:

>>> f = Fib()>>> print f(10)[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

代码

class Fib(object):    def __init__(self):        self.L = [0, 1]    def __call__(self, num):        i = 2        while(i<num):            self.L.append(self.L[i-1]+self.L[i-2])            i = i + 1        return self.Lf = Fib()print (f(10))

运行结果

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

python--__call__

评论关闭