在Python 3中设置动态类型的文档字符串

4

我正在动态创建一些类,希望它们具有不同的文档字符串。我有如下代码:

def make_class(class_docstring):
    class X:
        pass
    X.__doc__ = class_docstring
    return X

这并不起作用,因为文档字符串是只读的。然后,我尝试了:

def make_class(class_name, class_docstring):
    class X:
        def __init__(self):
            super().__init__()

    d = {'__doc__': class_docstring}
    d.update(X.__dict__)
    return type(class_name, (), d)

ClassName = make_class(
    'ClassName',
    """
    Some docstring...
    """)

这个代码一直运行正常,直到它需要调用super

动态设置文档字符串属性的正确方法是什么?


你的第一种方法完全正常。你为什么认为文档字符串是只读的?它们并不是。 - Sven Marnach
那是在Python 2.x中至少如此。你使用的是Python 3吗? - Sven Marnach
1个回答

5
你可以在类内设置docstring。
>>> def make_class(class_docstring):
...     class X:
...         __doc__ = class_docstring
...     return X
...
>>> x = make_class('test doc')
>>> x
<class '__main__.X'>
>>> xx = x()
>>> xx.__doc__
'test doc'

我不确定你的第二次尝试失败的原因。

第二次尝试失败是因为对super()的调用绑定到类型X(被翻译为super(X)),然后该方法被复制到动态创建的类型中,该类型在其__mro__中没有X - Neil G
我可以使用 globals()[class_name] = X 替代 return X 吗?这样我就可以只写 make_class('name', 'docstring') 而不是 name = make_class(… 了,这样可以吗? - Neil G
1
@NeilG:这可能有效,但是向全局变量中注入东西几乎总是不好的做法。使用 name = ... 更清晰明了。 - Thomas K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接