2009-09-04 25 views
9

你應該已經發現了我的術語,我是Python的n00b。Python shell的方法列表?

直截了當的問題:

我怎麼能看到的特定對象的方法列表中的交互式Python外殼就像我在紅寶石(你可以做,在紅寶石IRB與後一個」。方法目的)?

回答

17

現有的答案做你展示如何得到一個對象的屬性的一個不錯的工作,但不準確回答您提出的問題 - 如何獲得方法的一個對象。 Python對象具有統一的名稱空間(與Ruby不同,在Ruby中,方法和屬性使用不同的名稱空間)。考慮例如:

>>> class X(object): 
... @classmethod 
... def clame(cls): pass 
... @staticmethod 
... def stame(): pass 
... def meth(self): pass 
... def __init__(self): 
...  self.lam = lambda: None 
...  self.val = 23 
... 
>>> x = X() 
>>> dir(x) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', 
'__getattribute__', '__hash__', '__init__', '__module__', 
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', 
'__sizeof__', '__str__', '__subclasshook__', '__weakref__', 
'clame', 'lam', 'meth', 'stame', 'val'] 

((爲了可讀性,輸出拆分))。

正如你看到的,這是給你的所有屬性的名稱 - 其中包括大量的被剛剛從object繼承特殊的方法,特殊的數據屬性,如__class____dict____doc__,每個實例的數據屬性(val) ,每個實例的可執行屬性(lam)以及實際方法。

如果當你需要更多的選擇性,嘗試:

>>> import inspect 
>>> [n for n, v in inspect.getmembers(x, inspect.ismethod)] 
['__init__', 'clame', 'meth'] 

標準庫模塊inspect是做自省Python中的最佳方式:它建立在頂部的內置內省掛鉤(例如作爲dir和更先進的)爲您提供有用,豐富和簡單的自省服務。例如,在這裏,您會看到僅顯示此類專門設計的實例和類方法 - 不是靜態方法,不是可調用或不可調用的實例屬性,不是從object繼承的特殊方法。如果您的選擇性需求略有不同,可以輕鬆構建您自己的ismethod的調整版本,並將其作爲getmembers的第二個參數傳遞,以便根據您的確切需求量身定製結果。

8

dir(object)

會給你的列表中。

例如:

a = 2 
dir(a) 

將列出了所有你能要求一個整數的方法。

+0

作品!謝謝 – potlee 2009-09-04 13:42:08

2

這樣做:

dir(obj) 
5
>>> help(my_object) 
+1

這實際上並不正確。幫助用於顯示方法的文檔字符串文檔。例如幫助(string.upper)。 dir(obj)是需要的。 – mikej 2009-09-04 12:38:31

+0

正確。如果需要在Ruby中使用.methods,則dir(...)是正確的答案。 – 2009-09-04 12:39:34

+0

對於交互式使用(OP的用例),這實際上是最好的方法。幫助系統將打印出my_object的文檔,包括所有廣告方法的列表(不管它們是否有自己的文檔字符串)。它不會顯示名稱以'_'開頭的方法,但這通常是可以的,因爲這些方法是用於類的內部使用。 – alexis 2015-10-01 15:50:50

2

其他人所說的dir。讓我留心一下:Python對象可能有一個定義的方法,當你試圖調用一個未定義的方法時,它會被調用。顯然dir沒有列出所有這些(無限多)方法名稱。一些圖書館明確使用這個特徵,例如PLY(Python Lex-Yacc)。

例子:

>>> class Test: 
...  def __getattr__(self, name): 
...   return 'foo <%s>' % name 
... 
>>> t = Test() 
>>> t.bar 
'foo <bar>' 
>>> 'bar' in dir(t) 
False 
+0

...並從這個問題進行Ruby類比,Ruby類可能會覆蓋method_missing,當嘗試調用未定義的方法時會調用它,當然obj.methods無法知道要使用的方法名稱由method_missing處理。 – mikej 2009-09-04 12:46:17

+0

@mikej:謝謝!我沒有Ruby的經驗,但是當我寫下我的答案時,我確實認爲Ruby應該具有相同的功能。 – Stephan202 2009-09-04 12:53:53

0

如果你想只有方法,然後

def methods(obj): 
    return [attr for attr in dir(obj) if callable(getattr(obj, attr))] 

但不要嘗試IPython的,它有標籤完成對物體屬性,因此打字obj.<tab>顯示您的可用列表該對象的屬性。

+0

空閒支持tab-completion以及 – SilentGhost 2009-09-04 12:54:51

4

Python支持選項卡完成情況作爲好。我更喜歡我的Python提示符乾淨(所以不用感謝IPython),但選項卡完成。

設置在.bashrc或者類似:

PYTHONSTARTUP=$HOME/.pythonrc 

在.pythonrc將這個:

try: 
    import readline 
except ImportError: 
    print ("Module readline not available.") 
else: 
    print ("Enabling tab completion") 
    import rlcompleter 
    readline.parse_and_bind("tab: complete") 

這將打印「選項卡啓用完成」每個蟒蛇迅速啓動時間,因爲它是更好明確。這不會干擾python腳本和程序的執行。


例子:

>>> lst = [] 
>>> lst. 
lst.__add__(   lst.__iadd__(   lst.__setattr__(
lst.__class__(  lst.__imul__(   lst.__setitem__(
lst.__contains__(  lst.__init__(   lst.__setslice__(
lst.__delattr__(  lst.__iter__(   lst.__sizeof__(
lst.__delitem__(  lst.__le__(   lst.__str__(
lst.__delslice__(  lst.__len__(   lst.__subclasshook__(
lst.__doc__   lst.__lt__(   lst.append(
lst.__eq__(   lst.__mul__(   lst.count(
lst.__format__(  lst.__ne__(   lst.extend(
lst.__ge__(   lst.__new__(   lst.index(
lst.__getattribute__( lst.__reduce__(  lst.insert(
lst.__getitem__(  lst.__reduce_ex__( lst.pop(
lst.__getslice__(  lst.__repr__(   lst.remove(
lst.__gt__(   lst.__reversed__(  lst.reverse(
lst.__hash__   lst.__rmul__(   lst.sort(
+1

+1 tab完成使標準提示變得更愉快;我不知道爲什麼它默認不是。如果你想避免設置一個STARTUP,你也可以把代碼放在你的sitecustomize.py中(儘管在這種情況下你會省掉打印)。請注意,Windows和Mac用戶默認情況下不會有readline,需要下載適合的模塊,如pyreadline(Win)或readline.py(Mac)。 – bobince 2009-09-04 15:04:05

+0

使用sitecustomize.py它可能會影響python應用程序,而.bashrc中的PYTHONSTARTUP使得它只會在從命令行啓動時導入readline。這是如果我正確理解sitecustomize.py。 – u0b34a0f6ae 2009-09-04 16:02:26

+0

它會的,如果他們使用[raw_] input()。不過,這通常更有可能成爲一件有用的事情。 – bobince 2009-09-04 23:56:40

4

其簡單的爲您創建

dir(object) 

它會返回對象的所有屬性的列表中的任何對象做到這一點。