Python判断对象可调用的三种方式:callable、类型检查与__call__详解

Aria
Aria
发布时间:2026-10-13| 2人浏览过
原创

本文详解Python中判断对象是否可调用的三种方式:内置callable()函数、检查FunctionType类型以及检测__call__方法。通过对比类方法、实例方法和静态方法的验证结果,指出type()判断的局限性,并说明实现__call__的实例特性,建议直接使用callable()以确保稳妥。

查阅相关资料可知,判断Python对象是否为可调用对象(即可执行调用)主要存在三种常见方法。

第一种方法是使用Python内置的callable()函数。

callable(func)

该函数用于检测对象是否具备调用能力。其返回值为True时,仅代表对象可能支持调用,实际执行时仍有可能失败;但若返回False,则绝对确定该对象不可调用。

官方文档相关说明链接:https://docs.python.org/3/library/functions.html?highlight=callable#callable

第二种方法是判断对象的类型是否属于FunctionType。

type(func) is FunctionType
# 或者
isinstance(func, FunctionType)

第三种方法是判断对象是否实现了__call__方法。

hasattr(func, '__call__')

为了直观展示这三种验证方式的具体差异,下面编写一个测试Demo进行验证。

from types import FunctionType
__author__ = 'blackmatrix'


class ClassA:

 @staticmethod
 def func_a():
  pass

 @classmethod
 def func_b(cls, arg):
  pass

 def func_c(self, arg):
  pass


def func_d():
 pass

if __name__ == '__main__':

 class_a = ClassA()

 print('静态方法,实例调用验证')
 print("callable(class_a.func_a) result: {result}".format(result=callable(class_a.func_a)))
 print("type(class_a.func_a) is FunctionType result: {result}".format(result=type(class_a.func_a) is FunctionType))
 print("hasattr(class_a.func_a, '__call__') result: {result}".format(result=hasattr(class_a.func_a, '__call__')))

 print('静态方法,类调用验证')
 print("callable(ClassA.func_a) result: {result}".format(result=callable(ClassA.func_a)))
 print("type(ClassA.func_a) is FunctionType result: {result}".format(result=type(ClassA.func_a) is FunctionType))
 print("hasattr(ClassA.func_a, '__call__') result: {result}".format(result=hasattr(ClassA.func_a, '__call__')))

 print('类方法验证')
 print("callable(ClassA.func_b) result: {result}".format(result=callable(ClassA.func_b)))
 print("type(ClassA.func_b) is FunctionType result: {result}".format(result=type(ClassA.func_b) is FunctionType))
 print("hasattr(ClassA.func_b, '__call__') result: {result}".format(result=hasattr(ClassA.func_b, '__call__')))

 print('实例方法验证')
 print("callable(class_a.func_c) result: {result}".format(result=callable(class_a.func_c)))
 print("type(class_a.func_c) is FunctionType result: {result}".format(result=type(class_a.func_c) is FunctionType))
 print("hasattr(class_a.func_c, '__call__') result: {result}".format(result=hasattr(class_a.func_c, '__call__')))

 print('函数验证')
 print("callable(func_d) result: {result}".format(result=callable(func_d)))
 print("type(func_d) is FunctionType result: {result}".format(result=type(func_d) is FunctionType))
 print("hasattr(func_d, '__call__') result: {result}".format(result=hasattr(func_d, '__call__')))

通过运行上述测试代码,可以观察到三种方法的验证结果并不完全一致。

主要差异体现在使用type(func) is FunctionType进行判断时,对于类方法和实例方法的验证结果会返回False。

从调试输出的结果来看,实例方法和类方法的实际类型均为<class 'method'>,而非FunctionType,因此该判断方式会返回False。

静态方法,实例调用验证
callable(class_a.func_a) result: True
type(class_a.func_a) is FunctionType result: True
hasattr(class_a.func_a, '__call__') result: True
静态方法,类调用验证
callable(ClassA.func_a) result: True
type(ClassA.func_a) is FunctionType result: True
hasattr(ClassA.func_a, '__call__') result: True
类方法验证
callable(ClassA.func_b) result: True
type(ClassA.func_b) is FunctionType result: False
hasattr(ClassA.func_b, '__call__') result: True
实例方法验证
callable(class_a.func_c) result: True
type(class_a.func_c) is FunctionType result: False
hasattr(class_a.func_c, '__call__') result: True
函数验证
callable(func_d) result: True
type(func_d) is FunctionType result: True
hasattr(func_d, '__call__') result: True

这是因为在Python中,函数(function)和方法(method)有所区分。函数是可调用对象的一种,包括用户自定义的函数以及由lambda表达式创建的函数,它们的类型均为FunctionType;而方法则是一种特殊的类函数。

官方文档中对于method的定义如下:

Methods are always bound to an instance of a user-defined class

类方法与类本身绑定,实例方法与类的具体实例绑定,因此这两者的类型都被归类为method。

而静态方法既不与类绑定,也不与实例绑定,不符合上述method的定义,因此其类型仍为function。

此外还需注意,如果一个类实现了__call__方法,那么该类的实例也会成为一个可调用对象。此时,该实例的类型是创建它的类本身,而不是函数或方法类型。

class TheClass:

 def __call__(self, *args, **kwargs):
  return self

if __name__ == '__main__':
  the_class = TheClass()
  # True
  print('class_instance callable {callable} '.format(callable=callable(the_class)))

因此,若仅通过类型来判断Python对象是否可调用,需要同时判断其是否为函数(FunctionType)或方法(MethodType),或者检查该类是否实现了__call__方法。

如果目的仅仅是判断Python对象是否可调用,使用callable()方法是更为稳妥的选择。

以上关于判断Python对象是否可调用的三种方式及其区别的详细解析就是全部内容,希望能为大家提供参考,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。