方法可以被覆盖,但不必

时间:2018-10-11 18:30:44

标签: python python-3.x oop

我知道@abstractmethod中使用ABC是为了指示必须在ABC的具体实现中实现一种方法。

如果我的类具有可以覆盖但不能被覆盖的方法怎么办?让用户知道必须重写该方法才能提供功能的最佳方法是什么?

覆盖基本方法 的情况:

import warnings

class BaseClass(object):
    def foo(self):
        """This method can do things, but doesn't."""

        warnings.warn('This method must be overridden to do anything.')

class ConcreteClass(BaseClass):
    def foo(self):
        """This method definitely does things."""

        # very complex operation
        bar = 5

        return bar

用法:

>>> a = ConcreteClass()
>>> a.foo()
5

未覆盖基本方法 的情况:

import warnings

class BaseClass(object):
    def foo(self):
        """This method can do things, but doesn't."""

        warnings.warn('This method must be overridden to do anything.')

class ConcreteClass(BaseClass):
    def other_method(self):
        """Completely different method."""

        # code here

    def yet_another_method(self):
        """One more different method."""

        # code here

用法:

>>> a = ConcreteClass()
>>> a.foo()
__main__:1: UserWarning: This method must be overridden to do anything.

我想让基本方法根本不执行任何操作的原因主要是出于用户友好性。小组中使用软件经验较少的同事可能会从后踢中受益,这提醒他们使用我的软件包编写的脚本没有损坏,只是忘记添加一些东西。

1 个答案:

答案 0 :(得分:3)

可以重写python 已经中的方法,但不一定必须如此。
所以对于其余的问题:

  

让用户知道方法必须是   覆盖以提供功能?

您可以提出一个NotImplementedError

class BaseClass(object):
    def foo(self):
        raise NotImplementedError

class ConcreteClass(BaseClass):
    def foo(self):
        pass

关于

  

向后踢一脚,提醒他们他们用我写的脚本   包装没有损坏,他们只是忘了添加东西。

异常比警告更明确和有用(当打印成千上万条日志记录时很容易错过)