python __call__函数,__call__ python 用处_1

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: