![](/img/trans.png)
[英]When calling super().__init__ how can I tell if the super init is object.__init__ in python3?
[英]How can I make Python/Sphinx document object attributes only declared in __init__?
我有带有对象属性的 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),但到目前为止还没有运气。 有什么建议? 谢谢。
我已经尝试寻找一种标准方法来确保解析器可以找到这些“动态声明”的属性(最好是 docstring'd),但到目前为止还没有运气。 有什么建议?
它们永远不会被任何解析器“检测到”。
Python 有setattr
。 从任何意义上说,完整的属性集永远是“不可检测的”。
您绝对必须在文档字符串中描述它们。
[除非你想做一堆元编程来从你从inspect
或其他东西收集的东西中生成文档字符串。 即便如此,一旦您开始使用setattr
,您的“解决方案”就会不完整。]
class Foo(object):
"""
:ivar basepath:
:ivar availableruns:
"""
def __init__(self, base):
您可以定义一个与实例变量同名的类变量。 当您设置它时,该类变量将被实例变量隐藏。 例如:
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::
指令。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.