在 Python 开发中,经常会用到 with 语句来进行文件的读写操作。使用 with 语句方便开发,可是 with 语句的内部实现原理是什么呢?
我们在操作数据库的时候经常会自定义一个类,用来封装 SQL 的内部实现,便于在多个地方调用。今天我们依旧使用封装的数据库类作为模板进行 with 语句的探讨。
请看如下代码:
class SQLHelper(object): def open(self): print('与数据库建立连接') def feach(self, sql): print('在数据库中执行相关查询操作') def close(self): print('与数据库断开连接')
上述定义的类,你应该很熟悉了。
接下来我们来创建对象来实现响应的方法。
obj_sql = SQLHelper() obj_sql.open() obj_sql.feach('select * from class') obj_sql.close()
运行该模块,控制台会依次打印:
与数据库建立连接
在数据库中执行相关查询操作
与数据库断开连接
那么该如何实现 with 语句的内部原理呢?
我们可以查看 with 语句的内部实现代码,在 with 语句的内部代码中,最主要的是实现了__enter__和__exit__方法。
现在我们来为刚才定义的类添加上述两个方法,来模拟实现 with 语句的内部原理。
代码如下:
def __enter__(self): self.open() return self def __exit__(self, exc_type, exc_val, exc_tb): self.close()
接下来,我们使用 with 语句的方式实现通过定义对象实现的效果。
#系统默认调用__enter__方法, sql 就是__enter__返回值 with SQLHelper() as sql: # 当执行完毕之后,自动调用__exit__方法 sql.feach('select * from class')
运行之后,控制台同样打印:
与数据库建立连接
在数据库中执行相关查询操作
与数据库断开连接
现在你应该明白 with 语句的实现原理了吧!
综上所述,with 语句就是把我们的定义的方法,添加到系统默认调用的方法中进行二次封装,来达到简化代码的效果。