Python __call__ 方法

17 Mar 2025 | 4 分钟阅读

魔术方法的介绍

前缀和后缀带有双下划线的名称的方法是 Python 中用于特定用途的保留方法。例如,__init__ 方法用于对象构造函数,而 __call__ 方法用于使对象可调用。我们将这些方法称为 dunder 方法,其中 dunder 指的是 双下划线(下划线)。这些 dunder 方法 也被称为 魔术方法 - 然而,它们与魔术没有任何关系。Python 社区中有许多开发者不喜欢“魔术”这个词,因为它会给人一种不鼓励使用这种方法的感觉,但事实恰恰相反。

理解可调用函数

当对象在 __call__() 函数中定义时,Python 中的对象就称为可调用对象。相应的函数可以定义为 x(arg 1, arg 2, …),这是 x.__call__(arg1, arg2, …) 的简写。

对象何时可调用?

如果一个对象可以使用括号 () 调用,就像函数一样,那么它就被认为是可调用的。在 Python 中,有几样东西是可调用的:

  1. 函数: 使用 def 或 lambda 定义的常规函数。
  2. 方法: 定义在类内的函数。
  3. 类: 当您通过调用类来实例化一个类时,例如 obj = MyClass()。
  4. 对象: 如果对象的类实现了特殊方法 __call__。

注意:callable() 方法返回一个布尔值,指示对象是否可调用。如果对象可调用,则此函数返回 True;否则,它返回 False。此外,即使对象不可调用,此函数也可能返回 True。但是,如果此方法返回 False,则对象不可调用。

此外,Python 类总是可调用的。因此,我们可以始终使用 callable() 函数处理类的对象,而不是类本身。

让我们考虑以下示例以理解 Python callable() 函数的行为。

示例

输出

Employee Class is callable =  True
Employee object is callable =  False

说明

在上面的示例中,我们定义了一个类 Employee,它有一个变量 n = 0。然后我们定义了一个函数并实例化了该类。最后,我们使用 callable() 函数检查类及其对象是否可调用。

让我们考虑一个 __call__() 函数的例子。

示例

输出

<__main__.Person object at 0x000002706DF41FD0>
The Person object is callable:  True

说明

在上面的示例中,我们定义了 Person 类以及变量 person_id = 0person_name = " "。然后我们定义了初始化函数以及可调用函数。最后,我们实例化了该类,打印了对象,并检查了该对象是否可调用。结果,person 对象似乎是可调用的。

此外,我们可以观察到我们使用了 *args 来允许传递可变数量的参数,并使用 **kwargs 来允许将命名参数传递给 __call__() 方法。

现在,让我们考虑另一个例子,我们将使用 callable() 函数来检查对象是否可调用,然后将该对象作为函数调用。

示例

输出

Printing Arguments

Printing Keyword Arguments

Printing Arguments
15 30
Printing Keyword Arguments

Printing Arguments
15 30
Printing Keyword Arguments

Printing Arguments
15 30 {'a': 4, 'b': 8}
Printing Keyword Arguments

Printing Arguments
15 B
Printing Keyword Arguments
personname == George
personid == 50

说明

在上面的示例中,我们定义了一个 if 语句,其中如果对象 m 可调用,则该对象将被调用,无需参数、仅带参数、使用 __call__() 函数、带不同类型的参数以及带参数和关键字参数。结果,所需的对象的调用都成功了。