Python 添加的属性,setattr未显示在help()中

Python 添加的属性,setattr未显示在help()中,python,reflection,Python,Reflection,我有一个类,我正在用setattr添加一个帮助函数。该函数是一个正确创建的instancemethod,工作起来就像一个符咒 import new def add_helpfunc(obj): def helpfunc(self): """Nice readable docstring""" #code setattr(obj, "helpfunc", new.instancemethod(helpfunc, obj,

我有一个类,我正在用setattr添加一个帮助函数。该函数是一个正确创建的instancemethod,工作起来就像一个符咒

import new
def add_helpfunc(obj):
    def helpfunc(self):
        """Nice readable docstring"""
        #code

    setattr(obj, "helpfunc", 
            new.instancemethod(helpfunc, obj, type(obj)))
但是,在对对象实例调用帮助时,新方法不会作为对象的成员列出。我原以为help(即pydoc)使用dir(),但dir()有效,而不是help()


要更新帮助信息,我必须做些什么?

我知道您采用这种复杂方式的具体原因吗?为什么不这样做呢:

def add_helpfunc(obj):
    def helpfunc(self):
        """Nice readable docstring"""
        #code

    obj.helpfunc = helpfunc
如果我没有错的话,以这种方式添加方法也可以解决您的帮助问题

例如:

>>> class A:
...     pass
...
>>> add_helpfunc(A)
>>> help(A.helpfunc)
Help on method helpfunc in module __main__:

helpfunc(self) unbound __main__.A method
    Nice readable docstring

>>> help(A().helpfunc)
Help on method helpfunc in module __main__:

helpfunc(self) method of __main__.A instance
    Nice readable docstring

这样做的好处是什么?我并不是说怀疑,我真的很好奇。这种添加函数的用例是,我们有一组类,我们想作为开发人员以某种方式使用,但在交互式shell中以更包装、更美观的方式使用。我们没有采用并行类层次结构或类似的结构,而是在现有类中注入了一些有用的东西,并删除了一些过于强大的函数,以使shell更加友好。这似乎与上述解决方案的工作原理相同,因此在这方面做得更好。然而,在帮助下,它确实表现出同样的失败。但我认为问题在于函数被添加到对象上,而帮助是为类提供的。不幸的是,我不想把它添加到每个实例中,只是一个特定的子集。也许它只是层次结构中缺少的一个类,尖叫着要创建…我不确定你是对的。查看我的更新(必须在类上调用add_helpfunc,而不是在实例上),将其添加到类意味着将为类的每个实例显示信息。基本上,如果我有a=a()和b=a(),那么我希望能够添加_helpfunc(b),并从帮助(a)和帮助(b)中获得不同的结果。我认为您的答案是唯一实际的解决方案,我只需要创建一个新类,以便帮助获得不同的类,或者在帮助信息不完整的情况下使用。