Python __call__方法(详解版)
发布时间:2025-10-10 17:48:19

我们用 hasattr() 函数需要进一步判断指定属性(或方法)是否存在,但是是属性还是方法是否可调用。程序可以判断该属性(或方法)是否包含 __call__ 确定它是否可调用的属性。例如,以下程序:
classUser:
def__init__(self,name,passwd):
self.name=name
self.passwd=passwd
defvalidLogin(self):
print('验证%s登录'%self.name)
u=User('crazyit','leegang')
#判断u.name是否包含____call__方法,即判断是否可以调用
print(hasattr(u.name,'__call__'))#False
#判断u.passwd是否包含_____call__方法,即判断是否可调用
print(hasattr(u.passwd,'__call__'))#False
#判断u.validlogin是否包括___call__方法,即判断是否可调用
print(hasattr(u.validLogin,'__call__'))#True分别判断上述程序中的粗体字代码 User 对象的 name、 passwd、 validLogin 是否包含 __call__ 该方法,如果包含该方法,则表明它是可调用的,否则表明它是不可调用的。
从上述程序的输出结果中不难看出,对于 name、 passwd 由于两个属性都是不可调用的,程序正在判断它们是否包含在内 __call__ 方法时输出 False;对于 validLogin 方法,因为它是可调用的,程序正在判断它是否包含在内 __call__ 方法时输出 True。
事实上,一个函数(甚至对象)能够执行的关键在于 __call__() 实际上,方法 x(arg1, arg2,...) 只是 x.__call__(arg1, arg2, ...) 因此,我们甚至可以添加自定义类 __call__ 该方法使此类实例变得可调用。例如,代码如下:
#定义Role类
classRole:
def__init__(self,name):
self.name=name
#定义__call__方法
def__call__(self):
print('执行Role对象')
r=Role('管理员')
#Role对象的直接调用是调用对象的__call__方法
r()上述程序中的最后一行代码使用调用函数的语法来调用对象,这似乎是错误的,但因为 Role 类提供了 __call__ 因此,调用对象的本质是执行对象的方法 __call__ 方法。操作上述代码,将看到以下输出结果:
执行Role对象
对于程序中的函数,同样可以使用函数的语法来调用它,也可以使用函数作为对象来调用它 __call__ 方法如下示例代码:deffoo():
print('--foo函数-ལ)
#以下是两种调用foo()函数的方法
foo()
foo.__call__()
下一篇 Python可变参数函数用法详解
