【问题标题】:Setting a dynamic type's docstring in Python 3在 Python 3 中设置动态类型的文档字符串
【发布时间】:2011-11-16 01:18:12
【问题描述】:

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

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

动态设置docstring属性的正确方法是什么?

【问题讨论】:

  • 您的第一种方法效果很好。为什么你认为文档字符串是只读的?他们不是。
  • 也就是说,至少在 Python 2.x 中。你在使用 Python 3 吗?

标签: python python-3.x


【解决方案1】:

您可以在类中设置文档字符串。

>>> 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
  • 我可以使用:globals()[class_name] = X 而不是 return X,这样我就可以写 make_class('name', 'docstring') 而不是 name = make_class(…
  • @NeilG:它可能会起作用,但将东西注入全局变量几乎总是不好的做法。使用name = ... 更清晰。
猜你喜欢
  • 2021-11-16
  • 1970-01-01
  • 2014-11-26
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多