Python 添加的属性,setattr未显示在help()中
我有一个类,我正在用setattr添加一个帮助函数。该函数是一个正确创建的instancemethod,工作起来就像一个符咒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,
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)中获得不同的结果。我认为您的答案是唯一实际的解决方案,我只需要创建一个新类,以便帮助获得不同的类,或者在帮助信息不完整的情况下使用。