我想在某些动态创建的对象上提供文档(在我的程序中),但仍然可以使用他们的类文档。设置__doc__
似乎是一种合适的方法。但是,在这方面我无法在Python帮助中找到许多细节,在实例上提供文档是否有任何技术问题?例如:
class MyClass:
"""
A description of the class goes here.
"""
a = MyClass()
a.__doc__ = "A description of the object"
print( MyClass.__doc__ )
print( a.__doc__ )
答案 0 :(得分:5)
__doc__
被记录为 functions 的可写属性,但不是用户定义类的实例。例如,pydoc.help(a)
只会考虑在类型上定义的__doc__
。
其他协议(包括未来的用例)也可以合理地绕过实例dict中定义的特殊属性。请参阅datamodel文档的Special method lookup部分,具体来说:
对于自定义类,只有在对象的类型上定义,而不是在对象的实例字典中,才能保证特殊方法的隐式调用正常工作。
因此,根据属性的使用者,您打算做什么可能不可靠。的避免。强>
一个安全而简单的替代方法就是为您自己的用例使用您自己选择的不同属性名称,最好不使用__dunder__
语法约定,该约定通常表示为某些特定用途保留的特殊名称。实现和/或stdlib。
答案 1 :(得分:2)
有一些非常明显的技术问题;问题是它们是否对您的用例很重要。
以下是您的成语无法帮助的文档字符串的一些主要用途:
help(a)
:在交互式终端中输入help(a)
,您将获得MyClass
的文档字符串,而不是a
的文档字符串。< / LI>
a
值所做的任何特殊操作。许多文档生成器做有一些方法来指定模块和类常量的帮助,但我不知道任何会识别你的习语。以下是一些可能有用的地方:
a.__doc__ = …
附近的a
右侧告诉您的意图。然后,我可以通过Sphinx对常量的评论轻松地说出同样的意图。pdb
对于文档字符串并没有太大帮助,但是一些GUI调试器会在其中进行,并且大多数可能会显示a.__doc__
。 a.__doc__
有关的代码都会在需要时获取实例文档字符串,因此可以执行任何操作想要它。 但是,请记住,如果要定义自己的“协议”,则应使用自己的名称,而不是为实现保留的名称。 请注意,对于使用docstring的描述符,大多数情况都是如此:
>>> class C:
... @property
... def __doc__(self):
... return('C doc')
>>> c = C()
如果您输入c.__doc__
,则会获得'C doc'
,但help(c)
会将其视为没有文档字符串的对象。
值得注意的是,让help
工作一个的原因是一些动态代理库动态生成新类 - 即底层类型Spam
的代理有一些新类型,例如_SpamProxy
,而不是用于代理GenericProxy
和Ham
的相同Eggs
类型。前者允许help(myspam)
显示有关Spam
的动态生成信息。但我不知道重要是什么原因;通常你已经需要动态类,例如,进行特殊的方法查找工作,此时添加动态文档字符串是免费的。
答案 2 :(得分:1)
我认为首选通过您的文档字符串将其保留在类下,因为它还可以帮助任何处理代码的开发人员。但是,如果你正在做一些需要这种设置的动态,那么我就没有看到任何理由。只要明白它增加了一个间接层,使其他人不那么清楚。
记得K.I.S.S.适用时:)