doc为__getattr__定义了属性

时间:2012-02-03 16:11:04

标签: python getattr pydoc

我必须自定义__getattr__来调用另一个函数来阅读。

除了帮助(object.attr)不起作用外,这种方法很有效。此代码用于交互式环境,因此help()对我们来说非常重要。

是否有更好的设计来实现相同的功能,但帮助()运行良好。

2 个答案:

答案 0 :(得分:1)

您可以将属性转换为属性。该属性将自动使用getter方法的docstring作为自己的文档。或者,您可以向property()提供doc参数。

答案 1 :(得分:1)

用于“帮助”的文本确实是对象的“__doc__”属性。问题是,根据您拥有的对象,您不能简单地在其上设置__doc__属性。

如果您需要“help(object.attr)”工作(而不是help(object)显示所有可能的属性),那就更容易一点了 - 您应该只知道__getattr__返回做一个正确设置的文档字符串。

SInce“它不起作用”我猜你正在返回一些函数调用的内部结果,就像在这个代码片段中一样:

def __getattr__(self, attr):
    if attr == "foo":
        #function "foo" returns an integer
        return foo()
    ...

如果你只是简单地返回函数“foo”本身而不调用它,那么itśdocstring就会正常显示。

可以做的是将__getattr__中的返回值包装为动态创建的类的对象,该类包含适当的文档字符串 - 所以,尝试使用像这样的东西:

def __getattr__(self, attr):
    if attr == "foo":
        #function "foo" returns an (whatever object)
        result = foo()
        res_type = type(result)
        wrapper_dict = res_type.__dict__.copy()
        wrapper_dict["__doc__"] = foo.__doc__ #(or "<desired documentation for this attribute>")
        new_type = type(res_type.__name__, (res_type,), wrapper_dict)
        # I will leave it as an "exercise for the reader" if the 
        # constructor of the returned object can't take an object
        # of the same instance (python native data types, like int, float, list, can)
        new_result = new_type(result)
    elif ...: 
        ...
    return new_result

这应该有效 - 除非我弄错了为什么hel首先不起作用的动机 - 如果是这样的话,请举例说明你从__getattr__返回的内容。