• 硕杨Sxuya
    2018-10-10
    我自己编写的解释demo,可能更好理解吧,新手就是不知道代码里面到底是什么,总是简称代指,真的着急费解。

    一直无法理解demo就是demo为什么非要那么简单呢?太简单了理解就多了,只有信息冗余、互相关联,才能表达明确的意思。

    class AClassWithWith():
        def __init__(self):
            pass
        def __enter__(self):
            print("1.现在进入了,所以马上到这里,执行 __enter__ 这里的代码")
        def __exit__(self, exc_type, exc_val, exc_tb):
            print("2.结束使用这个 class 时,会执行这里面的代码,用打印内容代替")
            
    with AClassWithWith():
        print("3.这里的内容是class之外的操作,是在开始确认使用类AClassWithWith、执行 __enter__ 后才执行的,")
        print("4.执行完之后,就自动执行结束的 __exit__ 里面的内容,什么呢?如下:")
    展开

    作者回复: 考驾照为什么要了解发动机的原理呢?
    先学会把车发动、开的走、停的下才是这个阶段最需要关注的事情。
    会开车了还要不要了解发动机的原理呢?
    因为要了解不同的发动机的不同特性。
    demo掺杂了其他的功能就会给第一次接触这个功能的人带来技术债,当理解了这个知识的的why和what的时候,才来到第二步,利用搜索引擎文档社区这些工具把以前的知识连接起来。

     2
     9
  • 硕杨Sxuya
    2018-10-10
    我的意思是代码的解释太抽象简化了,简化到都和概念变成一样,本来是有区分度的东西,硬生生的把它变成了没太大区分度的东西。
    学习知识不就是应该需要在一定的情景下才能够更好的理解其中的运用逻辑,而这个演示完全把背景全抽没掉了,就好像空中阁楼一样,生活中根本没有完全无法想象到底有什么用。
    就像举例的学开车,只要知道转、启动、停就好了,但是不给学习的人看车的样子,就说一个刹车方向盘的概念,他也完全摸不着头脑呀。一个人从来没有见过汽车长什么样,你就说去踩刹车,他完全不知道去踩这个动作意味着什么。
    
     5
  • 硕杨Sxuya
    2018-10-10
    最直接的一个例子就是,程序本来就正常运行,却写一句程序正常运行“test is running”,那最后的提示是程序本身的情况,还是人为的字符串,2选1,实在是费解。

    作者回复: 提示信息太过简略,没有起到学习的辅助作用,反倒给学习增加了难度;理解了,后续内容会在这方面做优化的,感谢硕杨同学。

    
     4
  • 隰有荷
    2020-02-09
    老师,这个with后面直接跟的是一个类,那么如果在实例化该类的对象时,该怎么用with?
    比如:
    a=A()
    try:
        a. func()
    except Exception as e:
        pass

    上述操作如何使用with?
    展开

    作者回复: 1 在A类中实现 __enter__()和__exit__() ,支持with
    2 在A类中实现__call__() 支持调用

    这样就可以使用
    with A() as a:
        pass
    形式了

     1
    
  • 龙疯疯
    2020-02-01
    老师,在python例子中我们自定义with语句实现的exit方法其实就是finally吧,但是本质上异常还是被抛出去了,从异常代码处程序中断。 另外with open(file)语句的功能就是无论如何finally中帮我们close了资源,这点和java的try with resource语句有点像。不过总之with语句中异常是并没有被处理掉的,真正要吞掉异常还是需要我们去抓取异常(except)并处理。不知道我这样理解对不对

    作者回复: 首先 exit魔术方法 就是finally要做的事情,with语句实现了而已,如果自己需要累死功能实现__exit__()就好
    使用with open方式 打开的文件不用再去处理文件异常,其他的异常还是要处理的

    
    
  • 未央
    2019-11-26
    信息冗余有好有坏,不懂的人要的是你告诉他怎么做吧
    
    
  • 汤撒
    2019-07-18
    class WithTest:
        def __init__(self, name):
            self.name = name

        def __enter__(self):
            print('enter the test function')
            return self

        def do_run(self):
            print('run the test function', self.name)

        def __exit__(self, exc_type, exc_val, exc_tb):
            if exc_tb is None:
                print('finish the WithTest function')
            else:
                print('has error: %s' % exc_tb)
            

    with WithTest('tang') as w:
        w.do_run()
    老师您好,我发现这段代码里面,如果__enter__没有吧self返回回去,w就是一个空类型,我理解这些初始化、进入等函数应该是class生命周期中的模版方法?那么,我的疑问是,那些方法必须要返回self,那些方法不能返回(比如__init__),如何判断?比如Java,会有定义返回值类型等,python没有定义,我怎么能知道一个函数是否需要返回值呢?
    展开

    作者回复: 1 如果__enter__没有吧self返回回去,w就是一个空类型, 不写return也会返回NULL
    2 函数返回什么类型,什么值要编写函数的人确定,标准的写法都会有help() ,即用help(函数/类)可以查看定时的时候的帮助

    
    
  • 海绵宝宝
    2019-07-03
    在__exit__里面怎么把出现的异常捕获处理呢?

    作者回复: def __exit__(self, exc_type, exc_value, traceback):
        return True
    exit带了4个参数,通过exc_type 来判断要捕获的异常,如:
    if exc_type == IndexError:
        print(exc_value)

    
    
  • 兔子毛毛
    2019-05-19
    杨硕同学的解释容易理解很多,非常赞。
    
    
  • Archyomi
    2019-02-10
    老师,前面装饰器的用法是不是可以实现 with 的效果,如果是的话,两者有什么区别呢

    作者回复: 完全可以用with实现,前面是为了给大家讲解with实现的底层原理,比如with open() 要比自己写异常捕获优雅

    
    
  • Leo
    2019-01-03
    老师我咨询下:
    class Demo_1():
        def __enter__(self):
            print("start_1")
        def __exit__(self, exc_type, exc_val, exc_tb):
            if exc_tb is None:
                print("end_1")
            else:
                print("is %s" %exc_tb)

    with Demo_1():
        raise NameError("is a name")
        print("春雨")
    这段代码执行后会有红色报错提示嘛,视频中说with帮我们处理了try except 的工作,但是那章节中,报错是最后被expect处理了,转化成了我们自己的提示而不报红了,在with中怎么体现这个点呢?
    展开

    作者回复: with的本质是try except, 需要处理多个异常的时候可以使用多个except,看看从这个思路入手能不能帮你理解这个概念

    
    
  • 夜寂
    2018-10-31
    with open('file.txt','r') as f:
    r=f.read()
    老师请问一下这样改写过后,在哪里f.close()呀

    作者回复: 离开了with语句块文件就关闭了

    
    
  • 夜寂
    2018-10-31
    f=open('file.txt','r')
    try:
    r=f.read()
    except:
    pass
    finally:
    f.close()
    可以改写成
    with open('file.txt','r') as f:
    r=f.read()
    老师请问下如果这样改写过后在哪里f.close()呢
    用with只能打开这个文件创建f实际,并读取内容,但是在哪里关闭f呢,这个资源就一直会占用着吗?
    展开
     1
    
  • Nowz
    2018-09-14
    不明白with在这里的这个用法是什么作用。try的做法至少捕获异常,有针对处理。不太明白with在这里做了什么?

    作者回复: with 关键字 用于对try except finally 的优化,让代码更加美观,书写更简单。例如:
    f=open('file.txt','r')
    try:
        r=f.read()
    except:
        pass
    finally:
        f.close()
    可以改写成
    with open('file.txt','r') as f:
        r=f.read()

    
    
我们在线,来聊聊吧