【问题标题】:how to access object's method inside a with statement? [duplicate]如何在 with 语句中访问对象的方法? [复制]
【发布时间】:2018-09-09 18:42:44
【问题描述】:

我正在尝试在 python 3 中创建一个与“with”语句一起使用的类,但在“with”语句中我无法访问对象或方法。 例如,运行以下代码:

class Openizer:

    def __init__(self, something):
        self._something = something

    def __enter__(self):
        print('entered')

    def __exit__(self, exc_type, exc_value, traceback):
        print('exited')

    def print_something(self):
        print(self._something)


with Openizer('something') as op:
    op.print_something()

引发以下异常:

Traceback (most recent call last):
  File "openizer.py", line 16, in <module>
    op.print_something()
AttributeError: 'NoneType' object has no attribute 'print_something'

如果我尝试打印(操作)它会打印“无”。这是为什么?我使用 with 语句错了吗?什么是正确的方法?是否可以使用“with”语句实例化一个类,并在“with”语句中调用实例化对象的方法?

考虑 open() 函数,它实例化了一个可以读取或写入的文件对象,我想做类似的事情。

【问题讨论】:

  • 你必须在__enter__方法中return self
  • 你永远不会在你的 __enter__ 方法中返回任何东西,所以它隐式返回 None

标签: python python-3.x methods with-statement


【解决方案1】:

__enter__() 应该返回 self。从 __enter__ 返回的任何内容都会转到 as 子句。

【讨论】:

    猜你喜欢
    • 2019-06-24
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多