Python:覆盖基类

时间:2017-01-10 16:21:33

标签: python inheritance override

这可以在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"""

1 个答案:

答案 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')