该调用方法
几乎没有任何 Python 用户没有偶然发现诸如'dict' object is not callable
或 之类的异常'int' object is not callable
。过了一会儿,他们找出了原因。他们在不应该这样做的情况下使用了括号(圆括号)。像f(x)
,gcd(x, y)
或 之sin(3.4)
类的表达式通常用于函数调用。
问题是,'dict' object is not callable
如果我们写,为什么我们会得到消息d('a')
,如果d
是字典?为什么不说'dict' object is not a function
?
首先,当我们在 Python 中调用一个函数时,我们也说我们“调用了这个函数”。其次,Python 中有对象,它们像函数一样被“调用”,但严格来说不是函数。有“lambda 函数”,它们以不同的方式定义。也可以定义类,其中的实例可以像“常规”函数一样调用。这将通过增加另一个实现魔术方法的__call__
方法。
在我们介绍__call__
方法之前,我们必须知道什么是可调用对象。一般来说,“可调用的”是一个可以像函数一样被调用并且表现得像一个函数的对象。所有函数也是可调用的。Python 提供了一个名为 的函数callable
。借助这个函数,我们可以确定一个对象是否可调用。该函数callable
返回一个布尔真值,该值指示作为参数传递的对象是否可以像函数一样被调用。除了函数,我们已经看到了另一种形式callables
:类
def the_answer ( question ):
return 42
print ( "the_answer: " , callable ( the_answer ))
输出:
the_answer: 真的
该__call__
方法可用于将类的实例转换为可调用对象。函数是可调用的对象。一个可调用对象是一个可以使用并且表现得像一个函数但可能不是一个函数的对象。通过使用该__call__
方法,可以以实例是可调用对象的方式定义类。__call__
如果实例被称为“像函数一样”,即使用括号,则调用该方法。以下类定义是使用方法定义类的最简单的__call__
方法。
class FoodSupply :
def __call__ ( self ):
return "spam"
foo = FoodSupply ()
bar = FoodSupply ()
print ( foo (), bar ())
输出:
垃圾邮件
前面的类示例非常简单,但在实际中毫无用处。每当我们创建类的实例时,我们都会得到一个可调用对象。这些可调用对象始终定义相同的常量函数。没有任何输入和恒定输出“垃圾邮件”的功能。我们现在将定义一个稍微有用的类。让我们稍微改进一下这个例子:
类 FoodSupply :
def __init__ ( self , * incredients ):
self 。incredients = incredients
def __call__ ( self ):
result = " " 。加入(自我。成分) + “加上美味的垃圾邮件!”
返回 结果
f = FoodSupply ( "fish" ,