ZetCode

Python 可调用函数

上次修改时间:2025 年 4 月 11 日

本综合指南探讨了 Python 的 callable 函数,该函数检查对象是否看起来可调用。我们将涵盖函数、方法、类以及确定可调用性的实际示例。

基本定义

如果对象看起来可调用(可以像函数一样调用),则 callable 函数返回 True。 否则返回 False

主要特点:适用于函数、方法、类和实现 __call__ 的对象。 它有助于确定括号语法是否适用于对象。

基本函数检查

这是一个简单的用法,展示了 callable 如何识别 Python 中不同的可调用对象。

basic_callable.py
def my_function():
    return "Hello"

print(callable(my_function))  # True
print(callable(print))       # True (built-in function)
print(callable("hello"))     # False (string)
print(callable(42))          # False (integer)

此示例显示了 callable 与不同对象类型一起使用的情况。 函数返回 True,而像字符串和数字这样的不可调用对象返回 False

该函数有助于确定是否可以使用括号语法调用对象。 它对于动态编程场景非常有用。

检查类的可调用性

类是可调用的(它们创建实例),而实例可能可调用,也可能不可调用。 此示例演示了两者之间的区别。

class_callable.py
class MyClass:
    pass

class CallableClass:
    def __call__(self):
        return "Called!"

obj1 = MyClass()
obj2 = CallableClass()

print(callable(MyClass))      # True (classes are callable)
print(callable(obj1))         # False (no __call__ method)
print(callable(obj2))         # True (implements __call__)

该示例表明类始终是可调用的(它们可以实例化对象)。 只有当实例实现了 __call__ 方法时,它们才是可调用的。

在处理面向对象的 Python 代码和动态实例化时,这种区别非常重要。

方法和 Lambda

此示例演示了 callable 与方法和 lambda 函数一起使用的情况,它们也是可调用对象。

methods_lambdas.py
class Calculator:
    def add(self, a, b):
        return a + b

calc = Calculator()
lambda_func = lambda x: x * 2

print(callable(Calculator.add))  # True (unbound method)
print(callable(calc.add))        # True (bound method)
print(callable(lambda_func))     # True (lambda)
print(callable(str.upper))      # True (string method)

方法(包括绑定方法和未绑定方法)和 lambda 函数是可调用的。 callable 函数可以正确识别所有这些情况。

此行为在 Python 对象模型中不同类型的可调用对象之间是一致的。

自定义可调用对象

您可以通过实现 __call__ 方法使对象可调用。 此示例创建了一个可调用的计数器对象。

custom_callable.py
class Counter:
    def __init__(self):
        self.count = 0
    
    def __call__(self):
        self.count += 1
        return self.count

counter = Counter()
print(callable(counter))  # True
print(counter())          # 1
print(counter())          # 2

Counter 类实现了 __call__,使实例可调用。 callable 可以正确识别此功能。

此模式对于创建在调用之间保持状态的类函数对象非常有用。

实际用例

此示例显示了在插件系统中 callable 的实际用法,在该系统中你需要验证可调用处理程序。

plugin_system.py
def validate_handlers(handlers):
    for name, handler in handlers.items():
        if not callable(handler):
            raise ValueError(f"Handler '{name}' is not callable")

handlers = {
    'greet': lambda: print("Hello"),
    'exit': "not_a_function",
    'calculate': sum
}

try:
    validate_handlers(handlers)
except ValueError as e:
    print(f"Validation error: {e}")

该代码验证字典中的所有处理程序是否都可调用。 它会为不可调用的条目(例如字符串“not_a_function”)引发错误。

这演示了 callable 如何用于期望可调用对象的系统中的运行时验证。

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程