python中的__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
单看 p('Tim') 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。
再比如:
class A(object): def __init__(self,name,age): self.name=name self.age=age f=A('hello',18) print(f()) #TypeError: 'A' object is not callable
打印f()会报错object is not callable,f不是可调用对象
如果在类中加上__call__方法
class A(object): def __init__(self,name,age): self.name=name self.age=age def __call__(self, *args, **kwargs): return self.name,self.age f=A('hello',18) print(f()) #('hello', 18)
此时,f就是可调用对象