python--__call__,,__call__在P
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__
评论关闭