我有一个抽象基类Base
,它提供了一个需要由派生类实现的抽象方法_run()
,以及一个方法run()
,它将调用_run()
并执行一些常见的额外工作所有派生类。
在所有派生类中,我正在为_run()
方法设置函数docstring。由于此函数不是公共API的一部分,因此我希望在run()
方法中显示相同的文档字符串(和函数签名)。
请考虑以下示例:
import inspect
from abc import ABC, abstractmethod
class Base(ABC):
@abstractmethod
def _run(self):
return
def run(self, *args, **kwargs):
"""old_doc"""
return self._run(*args, **kwargs)
class Derived(Base):
def _run(self):
"""new_doc"""
return
[我最初的想法是在Base.__init__
或Base.__new__
中操纵文档字符串。这在某种程度上有效,但存在许多问题:
__init__
)。Base.run
设置文档字符串,实际上将为all派生类设置文档字符串。class Base(ABC):
def __init__(self):
type(self).run.__doc__ = type(self)._run.__doc__
type(self).run.__signature__ = inspect.signature(type(self)._run)
...
我希望的是:
>>> Derived.run.__doc__
'new_doc'
到目前为止我得到的是:
>>> Derived.run.__doc__
'old_doc'
>>> Derived().run.__doc__
'new_doc'
对此有任何解决方案吗?
请勿修改Base.run
的文档字符串;相反,请记录其作用:它调用子类定义的方法。