持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情
0 环境
- 编辑器:pycharm或者vscode
- 系统版本:windows10
- python版本:3.9.6
1 as的使用
上文with的文章中,提到过加了as就不用在加关闭的操作了。看看如下代码:
demo和d猜测应该是一样的,但是打印的结果,是不等的。并且打印出来的 的值也是没有的。
class Demo:
def __enter__(self):
print("Demo enter")
def __exit__(self, *args, **kwargs):
print("Demo exit")
demo = Demo()
with demo as d:
print("d -->", id(d))
print("demo -->", id(demo))
print("d的值 -->", d)
当我在__enter__中加了返回值,最后as打印出了这个self的值,是不是可以这么理解了,as是可以接收到__enter__的返回值的。如下图:字符串,列表这类的也可以接收到。
试过了__enter__,继续是__exit__,看看给它加个返回值会有什么效果。貌似啥动静么有,也就说明没办法获取__exit__的返回值的。
还有就是__enter__传入self就可以了,那么__exit__为毛,需要加上args和kwargs呢,有啥用呢。 如下代码:
class Demo:
def __enter__(self):
print("Demo enter")
# return "adc"
def __exit__(self, *args, **kwargs):
print("Demo exit")
print(f'args --> {args}, kwargs --> {kwargs}')
demo = Demo()
with demo as d:
pass
如下图:打印结果3个None。
我在with中写个异常,然后__exit__这里有了结果了,分别是异常的type,异常的实体,异常的track,但是我们通常不会在__exit__中做异常处理,了解即可,如下图:
2 总结
__enter__方法除了self以外,不带其他的参数,可以理解为光杆self。它的返回值as子句是可以接收到的,而__exit__的返回值as是不做接收的,__exit__可以接收到with里的异常,但是我们平常不在__exit__中做处理。