声明:以下内容均学习自《流畅的Python》一书
1、可调用对象
如果想判断对 象能否调用,可以使用内置的 callable() 函数。
# callable()检查是否可调用
[callable(obj) for obj in (abs, str, 'Ni!')] # [True, True, False]
9种可调用对象:
- 用户定义的函数:使用 def 语句或 lambda 表达式创建的函数。
- 内置函数:使用 C 语言(CPython)实现的函数,例如 len 或 time.strftime。
- 内置方法:使用 C 语言实现的方法,例如 dict.get。
- 方法:在类主体中定义的函数。
- 类:调用类时运行类的 __new__ 方法创建一个实例,然后运行 __init__ 方法,初始化实例,最后再把实例返回给调用方。Python 中 没有 new 运算符,调用类就相当于调用函数。
- 类的实例:如果类定义了 __call__ 方法,那么它的实例可以作为函数调用。
- 生成器函数:主体中有 yield 关键字的函数或方法。调用生成器函数返回一个 生成器对象。
- 原生协程函数:使用 async def 定义的函数或方法。调用原生协程函数返回一个协程对象。
- 异步生成器函数:使用 async def 定义,而且主体中有 yield 关键字的函数或方 法。调用异步生成器函数返回一个异步生成器,供 async for 使用。
与其他可调用对象不同,生成器、原生协程和异步生成器函数的返回值不是应用程序数据,而是需要进一步处理的对象,要么产出应用程序数据,要么执行某种操作。生成器函数会返回迭代器;原生协程函数和异步生成器函数返回的对象只能由异步编程框架(例如 asyncio)处理。