python中的__call__用法详解

call()的本质是将一个类变成一个函数(使这个类的实例可以像函数一样调用)

一个类实例要变成一个可调用对象,只需要实现一个特殊方法__call__()。

1、__call__魔法函数的使用

示例代码:

class A(object):def __init__(self, name, age):self.name = nameself.age = agedef __call__(self):print('my name is %s' % self.name)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):self.name = nameself.age = agedef __call__(self, male):print('my name is %s' % self.name)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):self.name = nameself.age = ageself.male = maledef __call__(self, name, age):self.name, self.age = name, ageif __name__ == '__main__':a = A('dgw', 25, 'man')print(a.age, a.name)a('zhangsan', 52)print(a.name, a.age)print(a.age, a.name)

运行结果:

25 dgw
zhangsan 52
52 zhangsan

2、__call__魔法函数:装饰器

示例代码:

class Decorator(object):def __init__(self, name):self.name = namedef __call__(self, func):def wrapper(*args, **kwargs):print(f"before func {func.__name__}")result = func(*args, **kwargs)print(f"after func {func.__name__}")return resultreturn wrapper@Decorator(name='dgw')
def my_func(x, y=10):return x + yif __name__ == '__main__':ret = my_func(5)print(ret)

运行结果:


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部