12

私の用語の使用法から、私が python n00b であることはすでにわかっているはずです。

率直な質問:

ruby でできるように、インタラクティブな python シェルで特定のオブジェクトのメソッドのリストを表示するにはどうすればよいですか (オブジェクトの後に '.methods' を使用して ruby​​ irb でそれを行うことができます)。

4

9 に答える 9

22

既存の回答は、オブジェクトの属性を取得する方法を示すのに適していますが、あなたが提起した質問、つまりオブジェクトの方法を取得する方法には正確には答えていません。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__vallam

より厳選する必要がある場合は、次のことを試してください。

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

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

于 2009-09-04T14:42:50.713 に答える
10

dir( object )

リストをくれます。

例えば:

a = 2
dir( a )

整数に対して呼び出すことができるすべてのメソッドをリストします。

于 2009-09-04T12:29:57.480 に答える
6

作成したオブジェクトに対してこれを行うのは簡単です

dir(object)

オブジェクトのすべての属性のリストを返します。

于 2014-04-09T17:09:05.127 に答える
5
>>> help(my_object)
于 2009-09-04T12:30:51.690 に答える
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(
于 2009-09-04T14:01:30.677 に答える
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()

ここで入手できます:

于 2009-09-04T13:25:31.420 に答える
2

これを行う:

dir(obj)
于 2009-09-04T12:30:22.033 に答える
2

他の人が言及してい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
于 2009-09-04T12:37:55.717 に答える
0

メソッドのみが必要な場合は、

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

ただし、IPython を試してみてください。オブジェクト属性のタブ補完があるため、入力するobj.<tab>と、そのオブジェクトで使用可能な属性のリストが表示されます。

于 2009-09-04T12:44:40.787 に答える