我知道@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.
我想让基本方法根本不执行任何操作的原因主要是出于用户友好性。小组中使用软件经验较少的同事可能会从后踢中受益,这提醒他们使用我的软件包编写的脚本没有损坏,只是忘记添加一些东西。
答案 0 :(得分:3)
可以重写python 已经中的方法,但不一定必须如此。
所以对于其余的问题:
让用户知道方法必须是 覆盖以提供功能?
您可以提出一个NotImplementedError
:
class BaseClass(object):
def foo(self):
raise NotImplementedError
class ConcreteClass(BaseClass):
def foo(self):
pass
关于
向后踢一脚,提醒他们他们用我写的脚本 包装没有损坏,他们只是忘了添加东西。
异常比警告更明确和有用(当打印成千上万条日志记录时很容易错过)