添加 class 装饰器以继承父文档

Add class decorator to inherit parent docs

我正在尝试向我的包中添加一个实用程序,其中子类将继承超类的文档字符串。这是我到目前为止的设置。

from functools import wraps
import typing as t


def inherit_parent_docs(klass):
    @wraps(klass)
    def inside(*args: t.Any, **kwargs: t.Any):
        parent_doc = B.__bases__[0].__doc__
        klass.__doc__ += parent_doc
        klass_out = klass(*args, **kwargs)
        return klass_out

    return inside

class A:
    """super"""

@inherit_parent_docs
class B(A):
    """sub"""
    def __init__(self):
        pass

但是,这不起作用,因为它说 B 没有 bases dunder 因为它认为它是一个函数。我检查了一下,很奇怪,type(B)function。我也尝试包装构造函数,但文档字符串仅在实例化时更新。

我觉得我在这里遗漏了一些明显的东西...

这就是装饰的作用。它将函数 inside 分配给 B.

所以当你

@inherit_parent_docs
class B(A):
    ...

这是语法糖:

class B(A):
    ...
B = inherit_parent_docs(B)

请注意,您可以不 return wrapper。 Return 修改后的Klass:

def inherit_parent_docs(klass):
    doc = klass.__doc__
    parent_doc = klass.__bases__[0].__doc__
    klass.__doc__ = f"{doc}\n{parent_doc}\n"
    return klass