私の用語の使用法から、私が python n00b であることはすでにわかっているはずです。
率直な質問:
ruby でできるように、インタラクティブな python シェルで特定のオブジェクトのメソッドのリストを表示するにはどうすればよいですか (オブジェクトの後に '.methods' を使用して ruby irb でそれを行うことができます)。
私の用語の使用法から、私が python n00b であることはすでにわかっているはずです。
率直な質問:
ruby でできるように、インタラクティブな python シェルで特定のオブジェクトのメソッドのリストを表示するにはどうすればよいですか (オブジェクトの後に '.methods' を使用して ruby irb でそれを行うことができます)。
既存の回答は、オブジェクトの属性を取得する方法を示すのに適していますが、あなたが提起した質問、つまりオブジェクトの方法を取得する方法には正確には答えていません。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
などの特別なデータ属性、インスタンスごとのデータ属性 ( )、インスタンスごとの実行可能属性 ( )、実際の方法も。__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
それを の 2 番目の引数として渡してgetmembers
、正確で正確なニーズに合わせて結果を調整できます。
dir( object )
リストをくれます。
例えば:
a = 2
dir( a )
整数に対して呼び出すことができるすべてのメソッドをリストします。
作成したオブジェクトに対してこれを行うのは簡単です
dir(object)
オブジェクトのすべての属性のリストを返します。
>>> help(my_object)
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(
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()
ここで入手できます:
これを行う:
dir(obj)
他の人が言及していdir
ます。注意を述べさせてください: 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
メソッドのみが必要な場合は、
def methods(obj):
return [attr for attr in dir(obj) if callable(getattr(obj, attr))]
ただし、IPython を試してみてください。オブジェクト属性のタブ補完があるため、入力するobj.<tab>
と、そのオブジェクトで使用可能な属性のリストが表示されます。