Python 可调用函数
上次修改时间:2025 年 4 月 11 日
本综合指南探讨了 Python 的 callable 函数,该函数检查对象是否看起来可调用。我们将涵盖函数、方法、类以及确定可调用性的实际示例。
基本定义
如果对象看起来可调用(可以像函数一样调用),则 callable 函数返回 True。 否则返回 False。
主要特点:适用于函数、方法、类和实现 __call__ 的对象。 它有助于确定括号语法是否适用于对象。
基本函数检查
这是一个简单的用法,展示了 callable 如何识别 Python 中不同的可调用对象。
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 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 函数一起使用的情况,它们也是可调用对象。
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__ 方法使对象可调用。 此示例创建了一个可调用的计数器对象。
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 的实际用法,在该系统中你需要验证可调用处理程序。
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 如何用于期望可调用对象的系统中的运行时验证。
最佳实践
- 用于验证:在尝试调用之前检查可调用性
- 与 hasattr 结合使用:进行更具体的检查(例如,
hasattr(obj, '__call__')) - 记录期望:明确记录何时需要可调用对象
- 考虑接口:对于复杂的系统,请考虑抽象基类
- 处理误报:某些对象可能可调用,但并非旨在被调用
资料来源
作者
列出所有 Python 教程。