【发布时间】:2020-12-21 20:21:58
【问题描述】:
我有一个基类,其方法使用with 语句。在子类中,我重写了相同的方法,然后想访问相同的 with 语句(而不是两个 with 语句)。
解决这个问题的标准方法是什么?
有关示例和可能的解决方案,请参见下文。
示例使用threading.Lock
from threading import Lock
class BaseClass:
def __init__(self):
self.lock = Lock()
self._data = 0
def do_something_locked(self) -> None:
with self.lock:
self._data += 5
class ChildClass(BaseClass):
def do_something_locked(self) -> None:
super().do_something_locked()
# Obviously the parent class's self.lock's __exit__ method has
# already been called. What are accepted methods to add more
# functionality inside parent class's "with" statement?
with self.lock:
self._data += 1
可能的解决方案
我的第一个倾向是在BaseClass 中定义一个私有方法,如下所示:
def do_something_locked(self) -> None:
with self.lock:
self._do_something()
def _do_something(self) -> None:
self._data += 5
然后ChildClass 可以覆盖_do_something。这样可以正常工作。
我想知道,还有其他解决这个问题的常见模式吗?
【问题讨论】:
标签: python oop with-statement contextmanager