当前位置: 首页 > 面试题库 >

使用上下文管理器时对象变为无

闻人德庸
2023-03-14
问题内容

为什么这项工作无效:

class X:
    var1 = 1
    def __enter__(self): pass
    def __exit__(self, type, value, traceback): pass

with X() as z:
    print z.var1

我得到:

print z.var1
AttributeError: 'NoneType' object has no attribute 'var1'

问题答案:

将的定义更改X

class X(object):
    var1 = 1
    def __enter__(self):
        return self
    def __exit__(self, type, value, traceback):
        pass

with将方法的返回值分配给__enter__()后面的名称as。您的__enter__()退货None,已分配给z

我还将该类更改为一种新式的类(使其起作用并不关键)。



 类似资料:
  • 要使人晓得智慧和训诲,分辨通达的言语。使人处事,领受智慧、仁义、公平、正直的训诲。使愚人灵明、使少年人有知识和谋略。使智慧人听见、增长学问、使聪明人得着智谋、使人明白箴言和譬喻、懂得智慧人的言词和谜语。敬畏耶和华使知识的开端,愚妄人藐视智慧和训诲。 上下文管理器 在《文件(1)》中提到,如果要打开文件,一种比较好的方法是使用with语句,因为这种方法,不仅结构简单,更重要的是不用再单独去判断某种异

  • Context managers for use with the with statement. 注解 When using Python 2.5, you will need to start your fabfile with from __future__ import with_statement in order to make use of the with statement (w

  • 问题内容: 我有一个异步API,用于连接邮件并将其发送到SMTP服务器,该服务器具有一些设置并已删除。因此,它非常适合使用Python 3的。 虽然,我不知道是否可以写,因为它们都使用生成器语法来写。 这可能证明了这个问题(包含yield-base和async-await语法的混合,以演示异步调用和上下文管理器的yield之间的区别)。 目前在python中可能发生这种情况吗?以及如何使用该 语句

  • 问题 你想让你的对象支持上下文管理协议(with语句)。 解决方案 为了让一个对象兼容 with 语句,你需要实现 __enter__() 和 __exit__() 方法。 例如,考虑如下的一个类,它能为我们创建一个网络连接: from socket import socket, AF_INET, SOCK_STREAM class LazyConnection: def __init_

  • 本文向大家介绍python 上下文管理器使用方法小结,包括了python 上下文管理器使用方法小结的使用技巧和注意事项,需要的朋友参考一下 上下文管理器最常用的是确保正确关闭文件, with 语句的基本语法, with expression [as variable]:     with-block expression是一个上下文管理器,其实现了enter和exit两个函数。当我们调用一个wit

  • 本文向大家介绍Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析,包括了Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python上下文管理器类和上下文管理器装饰器contextmanager用法。分享给大家供大家参考,具体如下: 一. 什么是上下文管理器 上下文管理