【发布时间】:2016-11-11 22:04:18
【问题描述】:
__enter__ 方法的返回值不应该总是self。
object.__enter__(self)输入与此相关的运行时上下文 目的。 with 语句将此方法的返回值绑定到 语句的 as 子句中指定的目标(如果有)。
有了这个,为了做任何实际的事情,不应该总是从类的__enter__ 方法返回self,因为没有它,我们将无法在上下文中调用其他类方法。
例如,在以下代码中,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()
【问题讨论】:
-
问题归结为“你能想象一个案例,从
__enter__返回除self以外的其他内容是可行的”。而且,嗯,这取决于你的幻想。 -
我认为任何对此问题感兴趣的人也可能会从 MisterMiyagi 对my related question的更详细回答中受益
标签: python