该__enter__方法的返回值不应该self始终是。
Python文档说:
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()
Run Code Online (Sandbox Code Playgroud)
如果使用实例的属性作为上下文管理器有意义,则不会:
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
.
.
.
Run Code Online (Sandbox Code Playgroud)
如果您使用任何方法,您提供的代码示例都可以工作str,例如:
with b() as b1:
print b1.upper()
>> SOMETHING ELSE
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1102 次 |
| 最近记录: |