Я пытаюсь создать класс, который будет использоваться с оператором with в Python 3, но внутри оператора 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'
Если я попытаюсь напечатать (op), он напечатает «Нет». Это почему? Я неправильно использую оператор with? какой правильный путь? Можно ли создать экземпляр класса с помощью оператора with, а внутри оператора with вызвать методы созданного объекта?
Рассмотрим функцию open (), она создала экземпляр файлового объекта, из которого можно читать или записывать, я бы хотел сделать что-то подобное.
Вы никогда ничего не возвращаете в своем методе __enter__
, поэтому он неявно возвращает None
.
__enter__()
должен вернуть self
. Все, что возвращается от __enter__
, попадает в пункт as
.
У вас есть
return self
в методе__enter__
.