2011-11-28 58 views
3

我有一個類,我正在添加一個幫助函數與setattr。該函數是一個正確創建的實例方法,並且像魅力一樣工作。屬性添加與setattr沒有顯示在幫助()

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

    setattr(obj, "helpfunc", 
      new.instancemethod(helpfunc, obj, type(obj))) 

但是,在調用對象實例的幫助時,新方法未列爲對象的成員。我認爲幫助(即pydoc)使用dir(),但dir()起作用而不起作用()。

我需要做些什麼才能獲得幫助信息更新?

+0

的優點是什麼從這樣做獲得?我的意思不是聽起來很懷疑,我真的很好奇。 –

+0

這種函數添加的用例是我們有一組類,我們希望以一種方式作爲開發人員使用,但在交互式shell中以更加簡潔和美觀的方式使用。我們爲現有的類注入了一些有益的東西,並刪除了一些功能太強大的功能,以使shell更友好,而不是具有並行類層次結構或其他類。 –

回答

2

我有一個具體的原因,你這樣做的複雜的方式?爲什麼不只是在做這樣的:

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 
+0

這似乎與上述解決方案的工作方式相同,所以在這方面更好。然而,它在幫助中顯示出同樣的失敗。但我認爲這個問題的確是在OBJECT上添加了這個函數,但是對CLASS的幫助。不幸的是,我不想將它添加到每個實例,只是一個特定的子集。也許這只是一個層次結構中缺少的類,尖叫將被創建...... –

+0

我不確定你是對的。查看我的更新(您必須在類上調用add_helpfunc,而不是在實例上) – gecco

+0

將其添加到類中意味着將爲類的每個實例顯示信息。基本上,如果我有a = A()和b = A(),那麼我希望能夠add_helpfunc(b)並從幫助(a)和幫助(b)中獲得不同的結果。我認爲你的答案是唯一的實際解決方案,我只需要創建一個新班級,以便幫助獲得不同的班級或者幫助信息不完整。 –