[英]Context manager inside a class instance
我想創建一個特定於另一個類的實例的上下文管理器類。 我可以通過調用創建類的方法來做到這一點,但是我不確定這是最好,最好的方法:
class MyClass(object):
def __init__(self):
self.level = 0
self.Nest = self.create_context_manager()
def inclev(self):
self.level += 1
def declev(self):
self.level -= 1
def create_context_manager(self):
self2 = self
class Nest(object):
def __init__(self):
pass
def __enter__(self):
self2.inclev()
def __exit__(self, exc_type, exc_value, traceback):
self2.declev()
return Nest
# Manually increase/decrease level
my_instance = MyClass()
print(my_instance.level)
my_instance.inclev()
print(my_instance.level)
my_instance.inclev()
print(my_instance.level)
my_instance.declev()
print(my_instance.level)
my_instance.declev()
print(my_instance.level)
# Use instance-specific context manager
other_instance = MyClass()
print(other_instance.level)
with other_instance.Nest():
print(other_instance.level)
with other_instance.Nest():
print(other_instance.level)
print(other_instance.level)
print(other_instance.level)
為什么需要嵌套類? 只需讓主要對象直接實現上下文管理協議即可:
class MyClass(object):
def __init__(self):
self.level = 0
def inclev(self):
self.level += 1
def declev(self):
self.level -= 1
__enter__ = inclev # For __enter__, just alias inclev, no need for wrapper
def __exit__(self, exc_type, exc_value, traceback):
self.declev()
然后將其與:
with other_instance:
print(other_instance.level)
with other_instance:
print(other_instance.level)
print(other_instance.level)
如果你真的需要上下文管理協議作為構建東西叫Nest
,你仍然可以簡化一點與內建contextlib
:
from contextlib import contextmanager
class MyClass(object):
def __init__(self):
self.level = 0
def inclev(self):
self.level += 1
def declev(self):
self.level -= 1
@contextmanager
def Nest(self):
self.inclev()
try:
yield
finally:
self.declev()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.