在基类中操作函数文档字符串和签名

问题描述 投票:0回答:1

我有一个抽象基类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__中操纵文档字符串。这在某种程度上有效,但存在许多问题:

  1. 我希望能够在派生类中重写这两种方法(至少是__init__)。
  2. 这需要在文档字符串可用之前实例化该类。
  3. 通过在实例化派生类时为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'

对此有任何解决方案吗?

python docstring abc
1个回答
0
投票

请勿修改Base.run的文档字符串;相反,请记录其作用:它调用子类定义的方法。

© www.soinside.com 2019 - 2024. All rights reserved.