Python 在重写_unew_uu返回初始化对象时如何使用上下文

Python 在重写_unew_uu返回初始化对象时如何使用上下文,python,Python,我已经实现了一个工厂类,它在\uuuu new\uuuu方法中返回一个初始化的类 class MyFactory(object): def __new__(self, my_obj, *args, **kwargs): if my_obj == ...: return A(*args, **kwargs) else: return B(*args, **kwargs) 两个类A和B都扩展了一个支持上下文的基

我已经实现了一个工厂类,它在
\uuuu new\uuuu
方法中返回一个初始化的类

class MyFactory(object):
    def __new__(self, my_obj, *args, **kwargs):
        if my_obj == ...:
            return A(*args, **kwargs)
        else:
            return B(*args, **kwargs)
两个类
A
B
都扩展了一个支持上下文的基类
MyBase()

class MyBase(object):
    def __enter__(self):
        ...

    def __exit__(self, exc_type, exc_val, exc_tb):
        ...
我试着像这样使用这个设置

with MyFactory(my_obj, ...) as something:
   something.do_something()
但是,由于python希望
MyFactory
类上存在
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

我应该做哪些更改才能实现上述用途

编辑:

我承认,这实际上是正确的做法。我的错误是由于在
\uuuuu enter\uuuu
方法中没有返回
self
:facepalm:


目前MyFactory只扩展了
项目

class MyFactory(object):
我认为MyFactory对象需要使用以下语法扩展MyBase:

class MyFactory(MyBase):
    ...
这将启用
\uuuu exit\uuuu
\uuuu enter\uuuu
方法的超类实例化,而无需在子类中再次明确描述它们


这有点像mashup,但由于您从
\uuuuu new\uuuuuu
调用返回对象,因此这可能是一个公平的选择

如果
。\uuuu new\uuuu()
方法返回的内容不是包含类的实例,则该类在返回对象的功能中不再起作用。换句话说,
MyBase
即使是一个类也没有意义,因为它从来都不是一个类——它也可能是一个普通函数。我相信您误解了抛出错误的原因,但由于您没有实际包含错误回溯,我不能确定。它应该会起作用。首先尝试将结果对象指定给变量,然后在with块中使用它,查看是否也会导致错误