2009-09-04 11 views
9

あなたはすでに私がPythonのn00bだという用語を私の使用法で知っていたでしょう。pythonシェルのメソッドのリスト?

まっすぐ質問:

私はルビーで(あなたが後に「.methods'でルビーIRBでそれを行うことができますすることができますように私はPythonの対話シェルで特定のオブジェクトのメソッドの一覧を見ることができますどのようにオブジェクト)?

答えて

17

既存の答えは、オブジェクトの属性を取得する方法をあなたに示すのは良い仕事をしますが、正確にあなたが提起質問に答えていない - のメソッドを取得する方法オブジェクトのPythonオブジェクトには統一された名前空間があります(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から継承されている特別なメソッドの多くを含むが、特別なデータは(val)など__class____dict____doc__は、インスタンスごとのデータ属性の属性、インスタンスごとの実行可能属性(lam)、および実際のメソッド

、あなたはより選択する必要がある場合、しようとした場合:

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

標準ライブラリモジュールinspectはPythonでイントロスペクションを行うための最善の方法である:それは内蔵のイントロスペクションのフックの上に構築されています(たとえば、 dirより先進のもの)を使用して、有用で豊かで簡単なイントロスペクションサービスを提供します。たとえば、このクラスによって特別に設計されたインスタンスメソッドとクラスメソッドのみが表示されます。静的メソッドではなく、objectから継承された特殊メソッドではなく、呼び出し可能かどうかのインスタンス属性ではありません。選択性のニーズがわずかに異なる場合は、ismethodの独自の調整バージョンを作成し、getmembersの2番目の引数として渡して、正確で正確なニーズに合わせて調整するのは簡単です。

8

dir(object)

はあなたのリストが表示されます。例えば

a = 2 
dir(a) 

あなたは、整数のために呼び出すことができるすべてのメソッドをオフに一覧表示されます。

dir(obj) 
+0

作品!ありがとうございます – potlee

2

はこれを行います。 Pythonオブジェクトには、オブジェクト上で未定義メソッドを呼び出そうとしたときに呼び出される__getattr__メソッドが定義されている可能性があります。明らかに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 
5
>>> help(my_object) 
+1

これは実際には正しくありません。ヘルプは、メソッドのドキュメンテーション文字列を表示するために使用されます。例えばヘルプ(string.upper)。 dir(obj)は必要なものです。 – mikej

+0

正しい。 Rubyの.methodsのようなものが必要な場合は、dir(...)が正しい答えです。 –

+0

インタラクティブな使用(OPのユースケース)では、これが実際には最良の方法です。ヘルプシステムは、宣言されたすべてのメソッドのリスト(独自のdocstringを持っているかどうかにかかわらず)を含む 'my_object'のドキュメントを出力します。 '_'で始まる名前のメソッドは表示されませんが、そのようなメソッドはクラスの内部使用のためであるため、通常はOKです。 – alexis

2

その他dirを言及している:

+0

...質問からRubyの類推を引き継ぐRubyクラスは、未定義のメソッドを呼び出そうとしたときに呼び出されるmethod_missingをオーバーライドしている可能性があります。もちろん、obj.methodsは意図したメソッド名について知ることができませんmethod_missingによって処理されます。 – mikej

+0

@mikej:ありがとう!私はRubyの経験はありませんが、私の答えを書いたとき、Rubyは同等の機能を持っているはずです。 – Stephan202

0

あなたが唯一の方法をしたい場合は、

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

しかし、IPythonを試してやる、それはそうobj.<tab>はあなたに利用できるのリストを示して入力し、オブジェクトの属性のタブ補完を持っていますそのオブジェクトの属性。

+0

アイドルでもタブ補完をサポート – SilentGhost

3

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() 

あなたはここでそれを得ることができます:

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のプロンプトが起動するたびに "タブ補完を有効にする" を印刷します

明示すること。これは、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のタブ補完により、標準プロンプトがはるかに快適になります。私はなぜそれがデフォルトでオンでないのか分からない。 STARTUPを設定する必要がないようにしたい場合は、sitecustomize.pyにコードを入力することもできます(ただし、この場合はプリントを省略します)。 WindowsとMacのユーザはデフォルトでreadlineを持っておらず、pyreadline(Win)やreadline.py(Mac)などの適切なモジュールをダウンロードする必要があることに注意してください。 – bobince

+0

sitecustomize.pyを使用すると、Pythonアプリケーションに影響を与える可能性があります.bashrcのPYTHONSTARTUPは、コマンドラインから起動したときだけreadlineをインポートするようにします。これは私が正しくsitecustomize.pyを理解している場合です。 – u0b34a0f6ae

+0

[raw_] input()を使用する場合は、そうです。しかし、これは一般的に何かを混乱させるよりも有用なものになりがちです。 – bobince

4

そのシンプルなあなたが、それは、オブジェクトのすべての属性のリストを返します

dir(object) 

を作成した任意のオブジェクトのためにこれを行います。