__enter__
方法的返回值始终不应为self
。
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()
答案 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