たとえば、私はこのコードを持っています:
with MyClass() as x:
print 'I have only {0}'.format(x)
with MyClass() as y:
print 'I have {0} and {1}'.format(x, y)
print 'Again only {0}'.format(x)
x
y
両方とも、対応するwith
ブロックの終了後に初期化を解除する必要があります。またx
、 とy
は のインスタンスではありませんMyClass
。
__exit__
には 3 つの引数しかなく、各引数は None です (例外が指定されていない場合)。
どの__exit__
ブロックで終了したか、どの値が返されたかをどのように判断でき__enter__
ますか?
(NB コードはスレッドセーフである必要があります)。
例:
class MyClass(object):
def __enter__(self):
if moon_phase > 0:
return 123
else:
return 456
def __exit__(self):
number = what_was_returned_by_enter()
print 'End of block with', number
with MyClass() as x:
print x # 123
with MyClass() as y:
print x, 'and', y # 123 and 456
# printed "End of block with 456"
print x # 123
# printed "End of block with 123"