`__enter__`方法的返回值是否应始终为python

时间:2016-07-09 12:35:12

标签: python

__enter__方法的返回值始终不应为self

Python documentation说:

  

object.__enter__(self)   输入与此相关的运行时上下文   宾语。 with语句将此方法的返回值绑定到   在语句的as子句中指定的目标(如果有的话)。

有了这个,为了做任何实际的事情,应该始终从类的self方法返回__enter__,因为没有它,就不能在上下文中调用其他类方法

例如,在以下代码中,s.main()工作正常但b1.main()错误。

class a(object):
    def __init__(self):
        pass

    def __enter__(self):
        return self

    def __exit__(self ,type, value, traceback):
        return self

    def main(self):
        print " in a::main self %d " , id(self)


class b(object):
    def __init__(self):
        pass

    def __enter__(self):
        return "something else"

    def __exit__(self ,type, value, traceback):
        pass

    def main(self):
        print "in b::main !! self id " , id(self)

with a() as s:
    s.main()

with b() as b1:
    b1.main()

s = a()
s.main()

1 个答案:

答案 0 :(得分:1)

如果将实例的属性用作上下文管理器是不合理的:

class A:
    def __init__(self, useful_obj):
        self.useful_obj = useful_obj

   def __enter__(self):
       return self.useful_obj

   def __exit__(self):
       pass

with A(some_obj) as a:
    # magic done implicitly by a.useful_obj
    .
    .
    .

这种情况可以在SqlAlchemy的code中找到。

如果您使用任何str方法,则您提供的代码示例将起作用,例如:

with b() as b1:
    print b1.upper()

>> SOMETHING ELSE