Я думаю, что для этого стоит использовать абстрактный базовый класс в Python 3.6. Возможно, вы захотите оформить execute
как @abstractmethod
, но ¯ \ _ (ツ) _ / ¯.
Теперь, если вы хотите немного больше контролировать свои строки документов, вы может создать свой собственный метакласс, который наследуется от ABCMeta
. Например, следующее - это способ иметь «расширяемые» строки документов в том смысле, что ваши строки документов становятся строками формата, где {pdoc}
всегда будет заменяться документацией вашего (первого) родительского класса (если он существует).
from abc import abstractmethod, ABCMeta
from inspect import getdoc
class DocExtender(ABCMeta):
def __new__(cls, name, bases, spec):
for key, value in spec.items():
doc = getattr(value, '__doc__', '{pdoc}')
try:
pdoc = getdoc(getattr(bases[0], key))
except (IndexError, AttributeError):
pdoc = ''
try:
value.__doc__ = doc.format(pdoc=pdoc)
except AttributeError:
pass
return ABCMeta.__new__(cls, name, bases, spec)
class ExecutorBase(metaclass=DocExtender):
@abstractmethod
def execute(self, data):
"""
Parent
"""
pass
class Executor1(ExecutorBase):
def execute(self, data):
"""
{pdoc} - Child
"""
return sum(data)
class Executor2(ExecutorBase):
def execute(self, data):
return sum(data)
print(getdoc(Executor1.execute))
# Parent - Child
print(getdoc(Executor2.execute))
# Parent
Я публикую это в основном для иллюстрации общей концепции; отрегулируйте по мере необходимости, очевидно.