Python可调用类型

一、用户定义函数

在Python中,用户可以通过函数定义来创建函数对象。当调用函数时,需要附带一个参数列表,其中包含的条目必须与函数所定义的形参列表一致。

特殊属性:

属性 含意  
__doc__ 该函数的文档字符串,没有则为 None;不会被子类继承。 可写
__name__ 该函数的名称。 可写
__qualname__ 该函数的 qualified name。 可写
3.3 新版功能.
__module__ 该函数所属模块的名称,没有则为 None。 可写
__defaults__ 由具有默认值的参数的默认参数值组成的元组,如无任何参数具有默认值则为 None。 可写
__code__ 表示编译后的函数体的代码对象。 可写
__globals__ 对存放该函数中全局变量的字典的引用 --- 函数所属模块的全局命名空间。 只读
__dict__ 命名空间支持的函数属性。 可写
__closure__ None 或包含该函数可用变量的绑定的单元的元组。 只读
__annotations__ 包含形参标注的字典。 字典的键是形参名,而如果提供了 'return' 则是用于返回值标注。 可写
__kwdefaults__ 仅包含关键字参数默认值的字典。 可写
__type_params__ 一个包含类型形参的元组,它们将传给 泛型函数。 可写

大部分标有 "Writable" 的属性均会检查赋值的类型。

二、实例方法

实例方法用于结合类、类实例和任何可调用对象 (通常为用户定义函数)。

特殊的只读属性:

  • __self__ 为类实例对象本身,__func__ 为函数对象;
  • __doc__ 为方法的文档 (与 __func__.__doc__ 作用相同);
  • __name__ 为方法名称 (与 __func__.__name__ 作用相同);
  • __module__ 为方法所属模块的名称,没有则为 None。

用户定义方法对象可在获取一个类的属性时被创建 (也可能通过该类的一个实例),如果该属性为用户定义函数对象或类方法对象。

  • 当通过从类实例获取一个用户定义函数对象的方式创建一个实例方法对象时,类实例对象的 __self__ 属性即为该实例,并会绑定方法对象。该新建方法的 __func__ 属性就是原来的函数对象。
  • 当通过从类或实例获取一个类方法对象的方式创建一个实例对象时,实例对象的 __self__ 属性为该类本身,其 __func__ 属性为类方法对应的下层函数对象。
  • 当一个实例方法对象被调用时,会调用对应的下层函数 (__func__),并将类实例 (__self__) 插入参数列表的开头。例如,当 C 是一个包含了 f() 函数定义的类,而 x 是 C 的一个实例,则调用 x.f(1) 就等同于调用 C.f(x, 1)。
  • 当一个实例方法对象是衍生自一个类方法对象时,保存在 __self__ 中的 "类实例" 实际上会是该类本身,因此无论是调用 x.f(1) 还是 C.f(1) 都等同于调用 f(C,1),其中 f 为对应的下层函数。

三、生成器函数

一个使用 yield 语句的函数或方法被称为生成器函数。当这样的函数被调用时,它总是返回一个可以执行该函数体的迭代器对象。通过调用该迭代器的 iterator.__next__() 方法,将导致这个函数一直运行到它使用 yield 语句提供一个值。当这个函数执行 return 语句或到达函数体末尾时,将引发 StopIteration 异常并且该迭代器将到达所返回的值集合的末尾。

四、协程函数

使用 async def 定义的函数或方法被称为协程函数。当这样的函数被调用时,它会返回一个 coroutine 对象。协程函数可以包含 await 表达式、async with 语句和 async for 语句。

五、异步生成器函数

  • 使用 async def 定义并使用了 yield 语句的函数或方法被称为异步生成器函数。当这样的函数被调用时,它将返回一个 asynchronous iterator 对象,该对象可以在 async for 语句中用于执行函数体。
  • 调用异步迭代器的 aiterator.anext 方法将返回一个 awaitable,此对象会在等待时一直执行直到使用 yield 产生一个值。当函数执行到空的 return 语句或到达函数末尾时,将会引发 StopAsyncIteration 异常并且异步迭代器也将到达要产生的值集合的末尾。
  • 使用 async def 定义并使用了 yield 语句的函数或方法被称为异步生成器函数。当这样的函数被调用时,它将返回一个 asynchronous iterator 对象,该对象可以在 async for 语句中用于执行函数体。
  • 调用异步迭代器的 aiterator.anext 方法将返回一个 awaitable,此对象会在等待时一直执行直到使用 yield 产生一个值。当函数执行到空的 return 语句或到达函数末尾时,将会引发 StopAsyncIteration 异常并且异步迭代器也将到达要产生的值集合的末尾。

六、内置函数

内置函数对象是对于 C 函数的外部封装。内置函数的例子包括 len() 和 math.sin() (math 是一个标准内置模块)。内置函数参数的数量和类型由 C 函数决定。特殊的只读属性:

  • __doc__ 是函数的文档字符串,如果没有则为 None;
  • __name__ 是函数的名称;
  • __self__ 设定为 None;
  • __module__ 是函数所属模块的名称,如果没有则为 None。

七、内置方法

这种类型实际上是内置函数的另一种形式,只不过还包含了一个隐式的额外参数,即传入 C 函数的对象。内置方法的一个示例是列表对象的 append() 方法。在此示例中,特殊的只读属性 __self__ 会被设置为列表对象所标记的对象。

八、类

在Python中,类是可调用对象。 这些对象通常是用作创建自身实例的“工厂”,但类也可以有重载 __new__() 的变体类型。 调用的参数会传递给 __new__(),并且在通常情况下,也会传递给 __init__() 来初始化新的实例。

九、类实例

任意类的实例可以通过在其所属类中定义 `__call__()` 方法来使其成为可调用对象。

广告合作
QQ群号:707632017

温馨提示:

1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com。(#改为@)

2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

目录