python笔记 对象as

75 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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)

image.png

当我在__enter__中加了返回值,最后as打印出了这个self的值,是不是可以这么理解了,as是可以接收到__enter__的返回值的。如下图:字符串,列表这类的也可以接收到。 image.png

image.png

image.png

试过了__enter__,继续是__exit__,看看给它加个返回值会有什么效果。貌似啥动静么有,也就说明没办法获取__exit__的返回值的。

image.png

还有就是__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

image.png

如下图:打印结果3个None。 image.png

我在with中写个异常,然后__exit__这里有了结果了,分别是异常的type,异常的实体,异常的track,但是我们通常不会在__exit__中做异常处理,了解即可,如下图: image.png

2 总结

__enter__方法除了self以外,不带其他的参数,可以理解为光杆self。它的返回值as子句是可以接收到的,而__exit__的返回值as是不做接收的,__exit__可以接收到with里的异常,但是我们平常不在__exit__中做处理。