浅谈with...as...
首先我们看段代码:
database = Adatabase(host,port) #初始化databasedatabase.connext() #调用database对象中的方法,这里为连接数据库
#----------------------------------------------------------------------------
try:
... #实际的业务代码
#----------------------------------------------------------------------------
except Exception, e:
print e #释放database资源
database.close() #处理异常
else:
database.close() #处理异常
以上代码在实际情况下连接数据库由于网络等原因出现异常,此时就要处理异常并且关闭数据库(和文件处理很相似)。
而我们在做web开发时,有时候需要连接很多次数据库,就需要我们重复很多遍上述代码,而对我们来说实际上写代码只有中间的实际业务代码是每次不一样的地方,而实例化,处理异常等都是一样的代码。那我们有什么办法可以实现这样呢?对我们来说只写一遍就可以了。魔法with语句很强大。
实现with语句,了解其原理:
class TestWith():
def __init__(self,*args,**kwargs): #此方法是python固定的
pass
def __enter__(self): #此方法是python固定的
return 一个变量(如:database)
def __exit__(self,exit_type,exit_value,exit_tb): #此方法是python固定的
return True
def myprint(self):
print self.path+"-->>>"+self.tag
with TestWith(...) as a:
a.myprint()
with...as...:他会先调用__init__,然后自动调用__enter__并且将返回参数给as后面的参数(这里就是a变量),如果没有返回变量或者你不需要用到这个变量,就可以不用as,及with TestWith(...),最后进入到__exit__方法。
__init__(self,*args,**kwargs):此方法参数表示任意多个未知参数和任意多个关键字参数,self肯定是要有的。
__enter__(self):只有self参数,后面不能有其他参数
__exit__(self,exit_type,exit_value,exit_tb):此参数都是有关异常的参数,改三个参数名字可以随便定义,分别为异常类型,异常值,异常的traceback对象,返回值True表示异常不在抛出,False和什么都不返回则表示异常再次抛出可以被try...except...捕获。
测试下:
以上是 浅谈with...as... 的全部内容, 来源链接: utcz.com/a/116154.html