Python __enter__ / __exit__ 与 __init__ (或 __new__)/ __del__

2024-03-07

我已经搜索过,但找不到任何使用 python 的充分理由__enter__ /__exit__而不是__init__ (or __new__ ?) / __del__ .

我明白那个__enter__ / __exit__旨在与使用with作为上下文管理器的声明,以及with声明很棒。但与之相对应的是,这些块中的任何代码都是only在该上下文中执行。通过使用这些而不是__init__ / __del__我似乎正在与调用者创建一个他们必须使用的隐式合约with,但是没有办法执行这样的合同,并且合同只能通过文档(或阅读代码)来传达。这似乎是个坏主意。

我似乎使用得到了相同的效果__init__ / __del__里面的一个with堵塞。但是通过使用它们而不是上下文管理方法,我的对象在其他场景中也很有用。

那么有人能想出一个令人信服的理由来解释为什么我会这么做吗?ever想要使用上下文管理方法而不是构造函数/析构函数方法?

如果有更好的地方可以问这样的问题,请告诉我,但似乎没有太多关于此的好信息。

跟进:

这个问题是基于一个糟糕的(但可能是常见的)假设,因为我总是使用with实例化一个新对象,在这种情况下__init__/__del__非常接近相同的行为__enter__/__exit__(除了你无法控制何时或是否__del__将被执行,这取决于垃圾收集,如果进程首先终止,则可能永远不会被调用)。但是如果你使用预先存在的对象with他们的说法当然是截然不同的。


您似乎忽略了几个差异:

  • 上下文管理器有机会为您正在执行的块提供一个新对象。一些上下文管理器只是返回self那里(就像文件对象一样),但是,作为一个例子,数据库连接对象可以返回与当前事务绑定的游标对象。

  • 上下文管理器不仅会收到上下文结束的通知,还会收到退出是否由异常引起的通知。然后它可以决定处理该事件或在退出期间做出不同的反应。再次以数据库连接为例,根据是否存在异常,您可以提交或中止事务。

  • __del__仅在以下情况下调用all对对象的引用被删除。这意味着如果您需要对它进行多个引用(您可能会或可能不会控制其生命周期),则不能依赖它被调用。然而,上下文管理器出口是精确定义的。

  • 上下文管理器可以是reused,并且他们可以保持状态。再次连接数据库;您创建它一次,然后一次又一次地将它用作上下文管理器,并且它将保持该连接打开。不需要每次都创建一个新对象。

    例如,这对于线程锁很重要;你have保持状态,以便一次只有一个线程可以持有锁。您可以通过创建来做到这一点one锁定对象,然后使用with lock:因此,执行该部分的不同线程可以在进入该上下文之前等待。

The __enter__ and __exit__方法形成上下文管理器协议,并且只有当您确实想要管理上下文时才应该使用它们。上下文管理器的目标是简化常见的try...finally and try...except模式,而不是管理单个实例的生命周期。看PEP 343 –“with”声明 https://www.python.org/dev/peps/pep-0343/:

此 PEP 在 Python 语言中添加了一个新语句“with”,以便能够分解 try/finally 语句的标准用法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python __enter__ / __exit__ 与 __init__ (或 __new__)/ __del__ 的相关文章

  • 在 Pandas 中,如何从基于另一个数据框的数据框中删除行?

    我有 2 个数据框 一个名为 USERS 另一个名为 EXCLUDE 他们都有一个名为 电子邮件 的字段 基本上 我想删除 USERS 中包含 EXCLUDE 中包含电子邮件的每一行 我该怎么做 您可以使用boolean indexing
  • 如何使用 colorchecker 在 opencv 中进行颜色校准?

    我有数码相机获取的色彩检查器图像 我如何使用它来使用 opencv 校准图像 按照以下颜色检查器图像操作 您是想问如何进行颜色校准或如何使用 OpenCV 进行校准 为了进行颜色校准 您可以使用校准板的最后一行 灰色调 以下是您应该逐步进行
  • TensorFlow:带有轴选项的 bincount

    在 TensorFlow 中 我可以使用 tf bincount 获取数组中每个元素的计数 x tf placeholder tf int32 None freq tf bincount x tf Session run freq feed
  • numpy python 中的“AttributeError:'matrix'对象没有属性'strftime'”错误

    我有一个维度为 72000 1 的矩阵 该矩阵涉及时间戳 我想使用 strftime 如下所示 strftime d m y 为了得到像这样的输出 11 03 02 我有这样一个矩阵 M np matrix timestamps 我使用了
  • NumPy linalg.eig

    我有这个烦人的问题 但我还没有弄清楚 我有一个矩阵 我想找到特征向量 所以我写 val vec np linalg eig mymatrix 然后我得到了 vec 我的问题是 当我小组中的其他人对相同的矩阵 mymatrix 做同样的事情时
  • 从 Python 下载/安装 Windows 更新

    我正在编写一个脚本来自动安装 Windows 更新 我可以将其部署在多台计算机上 这样我就不必担心手动更新它们 我想用 Python 编写这个 但找不到任何关于如何完成此操作的信息 我需要知道如何搜索更新 下载更新并从 python 脚本安
  • 从sklearn PCA获取特征值和向量

    如何获取 PCA 应用程序的特征值和特征向量 from sklearn decomposition import PCA clf PCA 0 98 whiten True converse 98 variance X train clf f
  • Pandas dataframe:每批行的操作

    我有一个熊猫数据框df我想计算每批行的一些统计信息 例如 假设我有一个batch size 200000 对于每批batch sizerows 我想要一列的唯一值的数量ID我的数据框 我怎样才能做这样的事情呢 这是我想要的一个例子 prin
  • 如何在Python中高效地添加稀疏矩阵

    我想知道如何在Python中有效地添加稀疏矩阵 我有一个程序 可以将大任务分解为子任务 并将它们分配到多个 CPU 上 每个子任务都会产生一个结果 一个 scipy 稀疏矩阵 格式为 lil matrix 稀疏矩阵尺寸为 100000x50
  • Python中列表中两个连续元素的平均值

    我有一个偶数个浮点数的列表 2 34 3 45 4 56 1 23 2 34 7 89 我的任务是计算 1 和 2 个元素 3 和 4 5 和 6 等元素的平均值 在 Python 中执行此操作的快捷方法是什么 data 2 34 3 45
  • 在相同任务上,Keras 比 TensorFlow 慢

    我正在使用 Python 运行斩首 DCNN 本例中为 Inception V3 来获取图像特征 我使用的是 Anaconda Py3 6 和 Windows7 使用 TensorFlow 时 我将会话保存在变量中 感谢 jdehesa 并
  • 如何在Python中按AaB而不是ABa顺序对字符串进行排序

    我正在尝试对字符串进行排序 为 punnetsquare 制作基因型 我目前的实现是 unsorted genotype ABaB sorted genotype sorted list unsorted genotype sorted s
  • 使用 Conda 更新特定模块会删除大量软件包

    我最近开始使用 Anaconda Python 发行版 因为它提供了许多开箱即用的数据分析库 使用 conda 创建环境和安装软件包也轻而易举 但是当我想更新 Python 本身或任何其他模块时 我遇到了一些严重的问题 我事先被告知我的很多
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 从 python 检测 macOS 中的暗模式

    我正在编写一个 PyQt 应用程序 我必须添加一个补丁 以便在启用暗模式的 Macos 上可以读取字体 app QApplication Fix for the font colours on macos when running dark
  • Flask 应用程序的测试覆盖率不起作用

    您好 想在终端的 Flask 应用程序中测试 删除路由 我可以看到测试已经过去 它说 test user delete test app LayoutTestCase ok 但是当我打开封面时 它仍然是红色的 这意味着没有覆盖它 请有人向我
  • PIL - 需要抖动,但限制调色板会导致问题

    我是 Python 新手 正在尝试使用 PIL 来执行 Arduino 项目所需的解析任务 这个问题涉及到Image convert 方法以及调色板 抖动等选项 我有一些硬件能够一次仅显示 16 种颜色的图像 但它们可以指定为 RGB 三元
  • 字符串列表,获取n个元素的公共子串,Python

    我的问题可能类似于this https stackoverflow com questions 37514193 count the number of occurrences of n length not given string in
  • 导入错误:无法导入名称“时间戳”

    我使用以下代码在 python 3 6 3 中成功安装了 ggplot conda install c conda forge ggplot 但是当我使用下面的代码将其导入笔记本时 出现错误 from ggplot import Impor
  • 如何使用Python保存“完整的网页”而不仅仅是基本的html

    我正在使用以下代码来使用 Python 保存网页 import urllib import sys from bs4 import BeautifulSoup url http www vodafone de privat tarife r

随机推荐

  • Android 如何根据背景图片改变文字颜色

    在 Android 上 我有一个带有背景图像的标题 根据 API 的随机图像 在这个标题上我有一些带有数据的文本 我的文字每次都是黑色的 但有时图像也是黑色的 所以我们看不到文字 我正在寻找库或代码片段来解决此问题 谢谢 您可以为此使用调色
  • 使用 __setstate__ 和 __getstate__ 的简单示例

    我不知道是什么 setstate and getstate 方法可以 所以请帮我举一个简单的例子 这是一个非常简单的 Python 示例 应该补充泡菜文档 http docs python org library pickle html p
  • (Delphi 10.2) 如何从我的应用程序在 Android 的 Web 浏览器中打开 URL?

    Delphi 10 2 2 Firemonkey Android 问题 如何从我的应用程序中打开 Android 网络浏览器中的 URL 我试图理解这里的概念 如何从我的应用程序在 Android 的网络浏览器中打开 URL https s
  • EclipseLink 合并意外级联

    我有两个实体类用户和设备 用户实体 public class User private Long userId OneToMany mappedBy userId fetch FetchType LAZY private Collectio
  • VS Image Watch 扩展 natvis 用于 BITMAPINFOHEADER?

    Visual Studio 的图像观察扩展 http goo gl TRe0X http goo gl TWre0X 允许您在调试时查看内存中的位图 非常有用 但是我一直试图定义一个 natvis 文件以允许查看 DIB 或 BITMAPI
  • 为什么performGC无法释放所有内存?

    鉴于该计划 import Language Haskell Exts Annotated from haskell src exts import System Mem import System IO import Control Exc
  • 注入 DAO 的 @Transactional 的 Spring WS 拦截器不起作用

    我们有一个基于 XML 的传统配置 spring ws 应用程序 其中包含端点拦截器 这些端点拦截器已注入 DAO 以从数据库获取配置 这些 DAO 注入了 hibernate sessionFactory 当我们升级到 spring 4
  • 将 SQLite 客户端数据库与 MySQL 服务器数据库同步

    我已经在 xcode 中使用 sqlite3 创建了一个应用程序 我想创建一个名为sync 的按钮来与我的服务器中的 mysql 数据库同步 关于同步过程有什么建议吗 请告诉我 好吧 您意识到这是一个不小的问题 去年 我为一个商业应用程序编
  • 日志文件存在于日志目录中,但在未启用日志功能的情况下启动

    我已经开始学习 MongoDB 并尝试将其安装在 Ubuntu 上 我最近从 Windows 转移到 Ubuntu 面临问题开始sudo service mongodb start 以下是日志 Sun Aug 4 20 25 36 774
  • 在 ViewPager 中多次使用一个 Fragment

    是否可以在视图分页器中多次使用一个片段 我正在尝试使用 ViewPager 构建动态更新的 UI 我想使用相同的设计 基本上是相同的片段 每个页面都有不同的数据 就像列表视图适配器一样 您可以为 ViewPager 中的每个页面实例化相同的
  • 如何获取在 iOS 示例应用程序中使用的图层名称? (张量流)

    我对 Tensorflow 非常陌生 我正在尝试使用 inception v3 网络来训练一些东西 以便在 iPhone 应用程序中使用 我设法将图表导出为协议缓冲区文件 手动删除 dropout 节点 我希望是正确的 并将该 pb 文件放
  • Android locationManager requestLocationUpdates 不起作用

    我正在开发一个应用程序 其中列出了距离用户最近的餐馆 单击刷新按钮后 它会列出用户当前位置的餐馆 我使用位置管理器并仅在活动进入前台 onResume 时请求更新 以避免持续使用电池 当应用程序进入 onPause 时 位置更新将停止 当我
  • 如何以及是否值得集成 Java Webapp + drools + Guvnor?

    我计划引入 Java 规则 目前正在评估 Drools 以从应用程序中外部化 物理上和逻辑上 业务规则 由于这些业务规则通常由企业制定 因此我希望企业通过 GUI 对规则进行必要的更改 我在 Google 上搜索了关于集成 java web
  • 更改 tvOS 上 SwiftUI 中按钮的颜色

    我正在尝试更改 SwiftUI 的颜色Button在电视操作系统上 修改background几乎可以工作 除了你可以看到底层UIButton实际上是在背景顶部使用圆形半透明图像 这会导致矩形背景位于圆形图像之外的角落处出现不同的颜色 Add
  • 如何在从url加载的ImageView中淡入图片

    我想对 ImageView 应用淡入动画 以创建从 url 加载的图像在下载完成时淡入的效果 我知道如何将图像从 url 下载到 ImageView 例如这个答案 https stackoverflow com questions 2471
  • 如何通过 Reasoning 实现 Apache Jena 中命名空间之间的映射?

    Goal 我不想在本体之间实现基于规则的映射 以完成数据迁移的常见任务 实现目标的方式 为了实现这一点 我开发了一个抽象数据结构 它能够存储任何数据类型的 xml 表示形式提供的所有信息 然后我编写了一个解析器 它根据目标文档类型定义构造了
  • 获取远程日志,而不是提交

    如何在不获取更改 提交的情况下获取远程日志 我只想查看日志 看看自上次以来是否有任何新的更改pull 基本上可以避免stash or commit我的改变先 git 帮助文件有这个例子 它以倒置的形式应该给出我想要的结果 git log m
  • WPF 中带有标题的边框

    有谁知道如何在 WPF 中获得带有标题的边框 即网络浏览器显示 标签的方式 有没有一种简单的方法 比如设置属性 或者我必须制作一个 ControlTemplate 也许是一个GroupBox http msdn microsoft com
  • 使用 JUnit 比较 ArrayList 是否相等的简单方法?

    使用 JUnit 比较 ArrayList 是否相等的简单方法是什么 我需要实现相等接口吗 或者有一个简单的 JUnit 方法可以使它更容易吗 对于列表相等性 您无需执行任何特殊操作 只需使用assertEquals即可 ArrayList
  • Python __enter__ / __exit__ 与 __init__ (或 __new__)/ __del__

    我已经搜索过 但找不到任何使用 python 的充分理由 enter exit 而不是 init or new del 我明白那个 enter exit 旨在与使用with作为上下文管理器的声明 以及with声明很棒 但与之相对应的是 这些