如何使用上下文管理器创建类的实例?

问题描述 投票:0回答:1

我想创建一个使用 requests.Session() 的类。因此,我想使用上下文管理器。但是,当我尝试访问该类的任何函数或变量时,上下文管理器会回复:

exception type:  <class 'AttributeError'>
exception value:  type object 'NoneType' has no attribute 'user'
exception trace:  <traceback object at 0x0000024CFAF30340>

我的代码:

Class request_session:
    def __init__(self, user="rwelch"):
        self.user = user
        self.session = (
            requests.Session()
        ) 

    def __enter__(self):
        print("Creating a new connection...")

    def __exit__(self, exception_type, exception_val, trace):
        print("Closing connection...")
        if exception_type:
            print(
                "exception type: ",
                exception_type,
                "\nexception value: ",
                exception_val,
                "\nexception trace: ",
                trace,
            )
            response = True
        else:
            response = False
        self.session.close()
        return response

...

with request_session() as request_session_handler:
   print(request_session_handler.user)

我从仅使用文件管理的示例中获得了这种类型的实现,因此我确信我在这里缺少一些基本的东西。

提前致谢

python class error-handling python-requests contextmanager
1个回答
0
投票

你应该

return
会话处理程序的值

或者,您通常可以避免创建自定义上下文管理器,并使用其中的

@contextlib.contextmanager
yield
来装饰函数

class Foo:
    def __enter__(self):
        self.managed_resource = bar()
        return self.managed_resource
    def __exit__(self):
        self.managed_resource.close()
@contextlib.contextmanager
def my_contextmgr():
    resource = bar()
    try:
        yield resource
    finally:
        resource.close()
© www.soinside.com 2019 - 2024. All rights reserved.