Python 用 "with statement"编写我的类

标签 python with-statement

我想用“with as statament”来启动我的类(class)。我正在使用 pyodbc 模块连接 mssql。

import pyodbc

class Db:
    DRIVER   =  r'DRIVER={ODBC Driver 13 for SQL Server};'
    SERVER   =  r'SERVER=192.168.1.1,1433;'
    DATABASE =  r'DATABASE=Client;'
    USERNAME =  r'UID=sa;' 
    PASSWORD =  r'PWD=1'    

    def __init__(self):
        self.cnxn = pyodbc.connect(self.DRIVER + self.SERVER + self.DATABASE + self.USERNAME + self.PASSWORD)
        self.cursor = self.cnxn.cursor()                

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("__exit__")
        self.cursor.close()
        self.cnxn.close()   


with Db() as d:
    print(d)

上面的代码工作正常,但是当我更改服务器名称时,它崩溃了,我在控制台上看不到 print("exit")。

最佳答案

仅当进入 with block 时才会调用 __exit__ 方法。不是 with 语句,而是附加到它的代码块。

如果Db()抛出异常,则__enter____exit__都不会被调用。如果你想一想,他们怎么可能呢? Db 对象从未成功构造,因此无法调用其方法。

关于Python 用 "with statement"编写我的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48209627/

相关文章:

python - web2py 中的 "unable to import requests"即使请求可以直接通过 python 访问

python - 沿现有轴连接/合并 xr.DataArray (Xarray | Python 3)

python - 输入层的形状

python - 仅当前一个可选字符匹配时,如何使用正则表达式来匹配可选字符?

postgresql - WITH 语句中的查询是否在 PostgreSQL 的单个事务中执行?

多行的 Python 嵌套上下文管理器

python - 在 python 终端中打印颜色

python - 即使使用 python with 语句,写入文件也无法完成

python - 使用 python with-statement 柯里化(Currying)?

python - With 语句的数量可变