这可以在python中做吗?
模块A:
def _helper:
print('helper_a')
class A():
def foo(self):
_helper()
模块B:
def _helper:
print('helper_b')
class B(A):
""" Somehow make B.foo call module B _helper without overriding A.foo"""
答案 0 :(得分:1)
_helper
只是模块A中的全局。您可以将其设置为其他内容,然后对A().foo()
的调用将使用该新的全局。这称为 monkey patching 。
但是,如果您只想在使用_helper
时修补class B
,那么您必须每次都进行修补和取消修补。这可以完成,但不是线程安全的,通常只有在你不能重构模块A时才能使用它:
class B(A):
def foo(self):
orig_helper = moduleA._helper
moduleA._helper = _helper
try:
return super().foo()
finally:
moduleA._helper = orig_helper
您也可以在课程foo
上覆盖B
:
def _helper:
print('helper_b')
class B(A):
""" Somehow make B.foo call module B _helper without overriding A.foo"""
def foo(self):
_helper()
如果可以重构模块A,可以使_helper
函数成为类中的静态函数:
class A():
@staticmethod
def _helper():
print('helper_a')
def foo(self):
self._helper()
此时您可以在B
上提供替代版本:
class B():
@staticmethod
def _helper():
print('helper_b')
等