有没有一种 pythonic 方法来包装 class 使用 with 语句?
Is there a pythonic way to wrap a class using with statement?
我做了以下,它有效,但我怀疑它的稳健性。
import B
class A():
def __init__(self):
self._b = B()
def __enter__(self):
return self._b .__enter__()
def __exit__(self, exc_type, exc_val, exc_tb):
return self._b .__exit__(exc_type, exc_val, exc_tb)
我知道 B.__enter__()
和 B.__exit__()
方法不应该在 B 之外使用,但我没有找到其他方法来做到这一点。
这样包装 class 是否可以接受?
还有别的办法吗?
我知道答案可能是:“不,这正是 with
的目的”
“methods B.__enter__()
and B.__exit__()
should not be used outside B”这句话是为了教新手程序员如何正确使用with
语句。
但是,您正在实施它。你所做的是完全可以接受和正确的。其实我也不知道有什么更好的方法。
这个问题实际上可以通过使用子 class 而不是包装器来解决(感谢@tripleee)
我忽略了这个选项,因为父 class 必须根据子 class 参数进行不同的实例化。但这可以按如下方式完成:
import B
class A(B):
def __init__(self, parameter):
if parameter == 1:
super().__init__(x=1)
elif parameter == 2:
super().__init__(y=2, z=3)
else:
raise ValueError
我做了以下,它有效,但我怀疑它的稳健性。
import B
class A():
def __init__(self):
self._b = B()
def __enter__(self):
return self._b .__enter__()
def __exit__(self, exc_type, exc_val, exc_tb):
return self._b .__exit__(exc_type, exc_val, exc_tb)
我知道 B.__enter__()
和 B.__exit__()
方法不应该在 B 之外使用,但我没有找到其他方法来做到这一点。
这样包装 class 是否可以接受?
还有别的办法吗?
我知道答案可能是:“不,这正是 with
的目的”
“methods B.__enter__()
and B.__exit__()
should not be used outside B”这句话是为了教新手程序员如何正确使用with
语句。
但是,您正在实施它。你所做的是完全可以接受和正确的。其实我也不知道有什么更好的方法。
这个问题实际上可以通过使用子 class 而不是包装器来解决(感谢@tripleee) 我忽略了这个选项,因为父 class 必须根据子 class 参数进行不同的实例化。但这可以按如下方式完成:
import B
class A(B):
def __init__(self, parameter):
if parameter == 1:
super().__init__(x=1)
elif parameter == 2:
super().__init__(y=2, z=3)
else:
raise ValueError