你應該已經發現了我的術語,我是Python的n00b。Python shell的方法列表?
直截了當的問題:
我怎麼能看到的特定對象的方法列表中的交互式Python外殼就像我在紅寶石(你可以做,在紅寶石IRB與後一個」。方法目的)?
你應該已經發現了我的術語,我是Python的n00b。Python shell的方法列表?
直截了當的問題:
我怎麼能看到的特定對象的方法列表中的交互式Python外殼就像我在紅寶石(你可以做,在紅寶石IRB與後一個」。方法目的)?
現有的答案做你展示如何得到一個對象的屬性的一個不錯的工作,但不準確回答您提出的問題 - 如何獲得方法的一個對象。 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
的第二個參數傳遞,以便根據您的確切需求量身定製結果。
dir(object)
會給你的列表中。
例如:
a = 2
dir(a)
將列出了所有你能要求一個整數的方法。
這樣做:
dir(obj)
>>> help(my_object)
這實際上並不正確。幫助用於顯示方法的文檔字符串文檔。例如幫助(string.upper)。 dir(obj)是需要的。 – mikej 2009-09-04 12:38:31
正確。如果需要在Ruby中使用.methods,則dir(...)是正確的答案。 – 2009-09-04 12:39:34
對於交互式使用(OP的用例),這實際上是最好的方法。幫助系統將打印出my_object的文檔,包括所有廣告方法的列表(不管它們是否有自己的文檔字符串)。它不會顯示名稱以'_'開頭的方法,但這通常是可以的,因爲這些方法是用於類的內部使用。 – alexis 2015-10-01 15:50:50
其他人所說的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
...並從這個問題進行Ruby類比,Ruby類可能會覆蓋method_missing,當嘗試調用未定義的方法時會調用它,當然obj.methods無法知道要使用的方法名稱由method_missing處理。 – mikej 2009-09-04 12:46:17
@mikej:謝謝!我沒有Ruby的經驗,但是當我寫下我的答案時,我確實認爲Ruby應該具有相同的功能。 – Stephan202 2009-09-04 12:53:53
如果你想只有方法,然後
def methods(obj):
return [attr for attr in dir(obj) if callable(getattr(obj, attr))]
但不要嘗試IPython的,它有標籤完成對物體屬性,因此打字obj.<tab>
顯示您的可用列表該對象的屬性。
空閒支持tab-completion以及 – SilentGhost 2009-09-04 12:54:51
對於dir()
的增強版檢查出see()
!
>>> test = [1,2,3]
>>> see(test)
[] in + += * *= < <= == != > >= hash()
help() iter() len() repr() reversed() str() .append()
.count() .extend() .index() .insert() .pop() .remove()
.reverse() .sort()
你可以在這裏得到它:
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 tab完成使標準提示變得更愉快;我不知道爲什麼它默認不是。如果你想避免設置一個STARTUP,你也可以把代碼放在你的sitecustomize.py中(儘管在這種情況下你會省掉打印)。請注意,Windows和Mac用戶默認情況下不會有readline,需要下載適合的模塊,如pyreadline(Win)或readline.py(Mac)。 – bobince 2009-09-04 15:04:05
使用sitecustomize.py它可能會影響python應用程序,而.bashrc中的PYTHONSTARTUP使得它只會在從命令行啓動時導入readline。這是如果我正確理解sitecustomize.py。 – u0b34a0f6ae 2009-09-04 16:02:26
它會的,如果他們使用[raw_] input()。不過,這通常更有可能成爲一件有用的事情。 – bobince 2009-09-04 23:56:40
其簡單的爲您創建
dir(object)
它會返回對象的所有屬性的列表中的任何對象做到這一點。
作品!謝謝 – potlee 2009-09-04 13:42:08