资讯专栏INFORMATION COLUMN

Python标准库---16、内置类型:上下文管理器类型、其他、特殊属性

zhisheng / 3039人阅读

摘要:退出运行时上下文并返回一个布尔值旗标来表明所发生的任何异常是否应当被屏蔽。除了实现上下文管理协议以外,不同类型不会被特殊处理。其中一些并不会被内置函数所列出。

上一篇文章:Python标准库---15、内置类型:集合类型、映射类型
下一篇文章:Python标准库---17、内置异常
上下文管理器类型

Python 的 with 语句支持通过上下文管理器所定义的运行时上下文这一概念。 此对象的实现使用了一对专门方法,允许用户自定义类来定义运行时上下文,在语句体被执行前进入该上下文,并在语句执行完毕时退出该上下文:

contextmanager.__enter__()

进入运行时上下文并返回此对象或关联到该运行时上下文的其他对象。 此方法的返回值会绑定到使用此上下文管理器的 with 语句的 as 子句中的标识符。

一个返回其自身的上下文管理器的例子是 file object。 文件对象会从 __enter__() 返回其自身,以允许 open() 被用作 with 语句中的上下文表达式。

一个返回关联对象的上下文管理器的例子是 decimal.localcontext() 所返回的对象。 此种管理器会将活动的 decimal 上下文设为原始 decimal 上下文的一个副本并返回该副本。 这允许对 with 语句的语句体中的当前 decimal 上下文进行更改,而不会影响 with 语句以外的代码。

contextmanager.__exit__(exc_type, exc_val, exc_tb)

退出运行时上下文并返回一个布尔值旗标来表明所发生的任何异常是否应当被屏蔽。 如果在执行 with 语句的语句体期间发生了异常,则参数会包含异常的类型、值以及回溯信息。 在其他情况下三个参数均为 None。

自此方法返回一个真值将导致 with 语句屏蔽异常并继续执行紧随在 with 语句之后的语句。 否则异常将在此方法结束执行后继续传播。 在此方法执行期间发生的异常将会取代 with 语句的语句体中发生的任何异常。

传入的异常绝对不应当被显式地重新引发 —— 相反地,此方法应当返回一个假值以表明方法已成功完成并且不希望屏蔽被引发的异常。 这允许上下文管理代码方便地检测 __exit__() 方法是否确实已失败。

Python 定义了一些上下文管理器来支持简易的线程同步、文件或其他对象的快速关闭,以及更方便地操作活动的十进制算术上下文。 除了实现上下文管理协议以外,不同类型不会被特殊处理。 请参阅 contextlib 模块查看相关的示例。

Python 的 generator 和 contextlib.contextmanager 装饰器提供了实现这些协议的便捷方式。 如果使用 contextlib.contextmanager 装饰器来装饰一个生成器函数,它将返回一个实现了必要的 __enter__() and __exit__() 方法的上下文管理器,而不再是由未经装饰的生成器函数所产生的迭代器。

请注意,Python/C API 中 Python 对象的类型结构中并没有针对这些方法的专门槽位。 想要定义这些方法的扩展类型必须将它们作为普通的 Python 可访问方法来提供。 与设置运行时上下文的开销相比,单个类字典查找的开销可以忽略不计。

其他内置类型

解释器支持一些其他种类的对象。 这些对象大都仅支持一两种操作。

模块

模块唯一的特殊操作是属性访问: m.name,这里 m 为一个模块而 name 访问定义在 m 的符号表中的一个名称。 模块属性可以被赋值。 (请注意 import 语句严格来说也是对模块对象的一种操作;import foo 不要求存在一个名为 foo 的模块对象,而是要求存在一个对于名为 foo 的模块的 (永久性) 定义。)

每个模块都有一个特殊属性 dict__。 这是包含模块的符号表的字典。 修改此字典将实际改变模块的符号表,但是无法直接对 dict 赋值 (你可以写 m.__dict__["a"] = 1,这会将 m.a 定义为 1,但是你不能写 m.__dict = {})。 不建议直接修改 __dict__。

内置于解释器中的模块会写成这样: 。 如果是从一个文件加载,则会写成

类与类实例

关于这些类型请参阅 对象、值与类型 和 类定义。

函数

函数对象是通过函数定义创建的。 对函数对象的唯一操作是调用它: func(argument-list)。

实际上存在两种不同的函数对象:内置函数和用户自定义函数。 两者支持同样的操作(调用函数),但实现方式不同,因此对象类型也不同。

更多信息请参阅 函数定义。

方法

方法是使用属性表示法来调用的函数。 存在两种形式:内置方法(例如列表的 append() 方法)和类实例方法。 内置方法由支持它们的类型来描述。

如果你通过一个实例来访问方法(即定义在类命名空间内的函数),你会得到一个特殊对象: 绑定方法 (或称 实例方法) 对象。 当被调用时,它会将 self 参数添加到参数列表。 绑定方法具有两个特殊的只读属性: m.__self__ 操作该方法的对象,而 m.__func__ 是实现该方法的函数。 调用 m(arg-1, arg-2, ..., arg-n) 完全等价于调用 m.__func__(m.__self__, arg-1, arg-2, ..., arg-n)。

与函数对象类似,绑定方法对象也支持获取任意属性。 但是,由于方法属性实际上保存于下层的函数对象中 (meth.__func__),因此不允许设置绑定方法的方法属性。 尝试设置方法的属性将会导致引发 AttributeError。 想要设置方法属性,你必须在下层的函数对象中显式地对其进行设置:

>>> class C:
...     def method(self):
...         pass
...
>>> c = C()
>>> c.method.whoami = "my name is method"  # can"t set on the method
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: "method" object has no attribute "whoami"
>>> c.method.__func__.whoami = "my name is method"
>>> c.method.whoami
"my name is method"

更多信息请参阅 标准类型层级结构。

代码对象

代码对象被具体实现用来表示“伪编译”的可执行 Python 代码,例如一个函数体。 它们不同于函数对象,因为它们不包含对其全局执行环境的引用。 代码对象由内置的 compile() 函数返回,并可通过从函数对象的 code 属性从中提取。 另请参阅 code 模块。

可以通过将代码对象(而非源码字符串)传给 exec() 或 eval() 内置函数来执行或求值。

更多信息请参阅 标准类型层级结构。

类型对象

类型对象表示各种对象类型。 对象的类型可通过内置函数 type() 来获取。 类型没有特殊的操作。 标准库模块 types 定义了所有标准内置类型的名称。

类型以这样的写法来表示:

空对象

此对象会由不显式地返回值的函数所返回。 它不支持任何特殊的操作。 空对象只有一种值 None (这是个内置名称)。 type(None)() 会生成同一个单例。

该对象的写法为 None。

省略符对象

此对象常被用于切片 (参见 切片)。 它不支持任何特殊的操作。 省略符对象只有一种值 Ellipsis (这是个内置名称)。 type(Ellipsis)() 会生成 Ellipsis 单例。

该对象的写法为 Ellipsis 或 ...。

未实现对象

此对象会被作为比较和二元运算被应用于它们所不支持的类型时的返回值。 请参阅 比较运算 了解更多信息。 未实现对象只有一种值 NotImplemented。 type(NotImplemented)() 会生成这个单例。

该对象的写法为 NotImplemented。

布尔值

布尔值是两个常量对象 False 和 True。 它们被用来表示逻辑上的真假(不过其他值也可被当作真值或假值)。 在数字类的上下文中(例如被用作算术运算符的参数时),它们的行为分别类似于整数 0 和 1。 内置函数 bool() 可被用来将任意值转换为布尔值,只要该值可被解析为一个逻辑值(参见之前的 逻辑值检测 部分)。

该对象的写法分别为 False 和 True。

内部对象

有关此对象的信息请参阅 标准类型层级结构。 其中描述了栈帧对象、回溯对象以及切片对象等等。

特殊属性

语言实现为部分对象类型添加了一些特殊的只读属性,它们具有各自的作用。 其中一些并不会被 dir() 内置函数所列出。

object.__dict__
一个字典或其他类型的映射对象,用于存储对象的(可写)属性。
instance.__class__
类实例所属的类。
class.__bases__
由类对象的基类所组成的元组。
definition.__name__
类、函数、方法、描述器或生成器实例的名称。
definition.__qualname__
类、函数、方法、描述器或生成器实例的 qualified name。

3.3 新版功能.
class.__mro__
此属性是由类组成的元组,在方法解析期间会基于它来查找基类。
class.mro()
此方法可被一个元类来重载,以为其实例定制方法解析顺序。 它会在类实例化时被调用,其结果存储于 __mro__ 之中。
class.__subclasses__()
每个类会保存由对其直接子类的弱引用组成的列表。 此方法将返回一个由仍然存在的所有此类引用组成的列表。 例如:
    >>> int.__subclasses__()
    []
上一篇文章:Python标准库---15、内置类型:集合类型、映射类型
下一篇文章:Python标准库---17、内置异常

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44010.html

相关文章

  • Python标准---17、内置异常

    摘要:关联值通常会作为参数被传递给异常类的构造器。所有内置异常的基类。此异常仅用于非限定名称。由内置函数和的方法所引发,用来表示该迭代器不能产生下一项。当一个或函数返回时,将引发一个新的实例,函数返回的值将被用作异常构造器的形参。 上一篇文章:Python标准库---16、内置类型:上下文管理器类型、其他、特殊属性下一篇文章:Python标准库---18、文本处理服务:string 常见的字...

    mylxsw 评论0 收藏0
  • Python标准---15、内置类型:集合类型、映射类型

    摘要:目前有两种内置集合类型,和。两个类的构造器具有相同的作用方式返回一个新的或对象,其元素来自于。要表示由集合对象构成的集合,所有的内层集合必须为对象。目前仅有一种标准映射类型字典。 上一篇文章:Python标准库---14、内置类型:二进制序列类型 (memoryview)下一篇文章:Python标准库---16、内置类型:上下文管理器类型、其他、特殊属性 集合类型 --- set, ...

    kycool 评论0 收藏0
  • Python标准---14、内置类型:二进制序列类型 (memoryview)

    摘要:对于更高的维度,其长度等于表示的嵌套列表的长度。这是数组在连续表示时将会占用的空间总字节数。该值仅作为参考信息。新版功能一个表明内存是否为的布尔值。新版功能上一篇文章标准库内置类型二进制序列类型下一篇文章标准库内置类型集合类型映射类型 上一篇文章:Python标准库---13、内置类型:二进制序列类型 ( bytes, bytearray)下一篇文章:Python标准库---15、内置...

    yacheng 评论0 收藏0
  • [译] 与 Python 无缝集成——基本特殊方法 4

    摘要:当引用计数为零,则不再需要该对象且可以销毁。这表明当变量被删除时引用计数正确的变为零。方法只能在循环被打破后且引用计数已经为零时调用。这两步的过程允许引用计数或垃圾收集删除已引用的对象,让弱引用悬空。这允许在方法设置对象属性值之前进行处理。 注:原书作者 Steven F. Lott,原书名为 Mastering Object-oriented Python __del__()方法 ...

    Allen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<