python __call__函数,__call__ python 用处
我们用hasattr()函数来判断指定的属性(或方法)是否存在,但究竟是属性还是方法还需要进一步判断是否可以调用。程序可以通过判断是否包含__call__属性来确定这个属性(或方法)是否可以被调用。
例如,下面的程序:
classUser:
def__init__(self,name,passwd):
self.name=name
self.passwd=passwd
defvalidLogin(self):
Print(验证%s %self.name 的登录)
u=用户( 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上述程序中的加粗代码分别确定用户对象的name、passwd和validLogin是否包含__call__方法。如果包含此方法,则表明它是可调用的,否则表明它是不可调用的。
从上面程序的输出结果不难看出,对于name和passwd这两个属性,因为不可调用,所以程序输出False当判断它们是否包含__call__方法时;对于validLogin方法,因为它是可调用的,所以程序在判断它是否包含__call__方法时输出True。
实际上,一个函数(甚至是一个对象)执行的关键在于__call__()方法。实际上,x(arg1,arg2,)只是x.__call__(arg1,arg2,),所以我们甚至可以在自定义类中添加__call__方法,从而使类的实例可调用。例如,下面的代码:
#定义角色类
classRole:
def__init__(self,name):
self.name=name
#定义__call__方法
def__call__(self):
打印(“执行角色对象”)
r=角色(“管理员”)
#直接调用角色对象意味着调用对象的__call__方法。
r()上面程序中的最后一行代码使用了调用函数的语法来调用对象,这似乎是错误的。但是,由于角色类提供了__call__方法,调用对象的本质就是执行对象的__call__方法。运行上面的代码,您将看到以下输出结果:
对于程序中的函数执行角色对象,你也可以使用函数的语法来调用它,或者把函数作为对象调用它的__call__方法。例如,下面的示例代码:deffoo():
打印(-foo函数-)
#下面演示了调用foo()函数的两种方法
foo()
福。__call__()
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。