当前位置: 首页 > 图灵资讯 > 行业资讯> Python __call__方法(详解版)

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 __call__方法(详解版)

Python __call__方法(详解版)

2025-10-10
Python之字符编码相关介绍

Python之字符编码相关介绍

2025-10-10
Python queue双端队列模块及用法

Python queue双端队列模块及用法

2025-10-10
Python之列表的增删改查

Python之列表的增删改查

2025-10-10
Python itertools模块:生成迭代器(实例分析)

Python itertools模块:生成迭代器(实例分析)

2025-10-10
Python中的变量命名规则

Python中的变量命名规则

2025-10-09