python中的__call__()方法
call()的本质是将一个类变成一个函数(使这个类的实例可以像函数一样调用)
一个类实例要变成一个可调用对象,只需要实现一个特殊方法__call__()。
示例代码:
class A(object):
def __init__(self, name, age):
= name
self.age = age
def __call__(self):
print('my name is %s' % )
print('my age is %s' % self.age)
if __name__ == '__main__':
a = A('dgw', 25, )
a()
运行结果:
my name is dgw
my age is 25
这里定义的类A是需要两个参数的,一个名字一个年龄,我们传入参数后就有了实例a,实例a直接调用就是call方法,这个方法使得a这个类也成为了一个函数,可以调用,也可以为它增加参数,如
class A(object):
def __init__(self, name, age):
= name
self.age = age
def __call__(self, male):
print('my name is %s' % )
print('my age is %s' % self.age)
print('my male is %s' % male)
if __name__ == '__main__':
a = A('dgw', 25, )
a('woman')
运行结果:
my name is dgw
my age is 25
my male is woman
允许一个类的实例像函数一样被调用。实质上说,这意味着 x() 与 x.__call__() 是相同的。注意 __call__ 参数可变。这意味着你可以定义 __call__ 为其他你想要的函数,无论有多少个参数。
__call__ 在那些类的实例经常改变状态的时候会非常有效。调用这个实例是一种改变这个对象状态的直接和优雅的做法。
class A(object):
def __init__(self, name, age, male):
= name
self.age = age
self.male = male
def __call__(self, name, age):
, self.age = name, age
if __name__ == '__main__':
a = A('dgw', 25, 'man')
print(a.age, )
a('zhangsan', 52)
print(, a.age)
print(a.age, )
运行结果:
25 dgw
zhangsan 52
52 zhangsan