我有带有对象属性的Python类,它们只被声明为运行构造函数的一部分,如下所示:
class Foo(object):
def __init__(self, base):
self.basepath = base
temp = []
for run in os.listdir(self.basepath):
if self.foo(run):
temp.append(run)
self.availableruns = tuple(sorted(temp))
如果我现在使用help(Foo)
或尝试在Sphinx中记录Foo
,则不会显示self.basepath
和self.availableruns
属性。这对我们API的用户来说是一个问题。
我已经尝试了一种标准的方法来确保解析器可以找到这些“动态声明的”属性(最好是docstring'd),但到目前为止还没有运气。有什么建议?感谢。
答案 0 :(得分:8)
我已经尝试了一种标准的方法来确保解析器可以找到这些“动态声明的”属性(最好是docstring'd),但到目前为止还没有运气。有什么建议?
任何解析器都无法“检测”它们。
Python有setattr
。在任何意义上,完整的属性集都不会“可检测”。
您绝对必须在docstring中描述它们。
[除非你想做一堆元编程,以便从你从inspect
或其他东西收集的东西中生成文档字符串。即使这样,一旦开始使用setattr
,您的“解决方案”就会不完整。]
class Foo(object):
"""
:ivar basepath:
:ivar availableruns:
"""
def __init__(self, base):
答案 1 :(得分:2)
您可以定义一个与实例变量同名的类变量。然后,当您设置它时,该类变量将被实例变量遮蔽。 E.g:
class Foo(object):
#: Doc comment for availableruns
availableruns = ()
def __init__(self, base):
...
self.availableruns = tuple(sorted(temp))
实际上,如果实例变量有一个有用的不可变默认值(例如None或空元组),那么你可以通过不设置变量来节省一点内存,如果它应该有它的默认值。当然,如果您正在讨论可能要删除的实例变量(例如del foo.availableruns
),这种方法将无效 - 但我发现这不是一个非常常见的情况。
如果你正在使用sphinx并设置了“autoattribute”,那么应该适当地记录下来。或者,根据您正在做的事情的上下文,您可以直接使用Sphinx .. py:attribute::
指令。