570

任意の種類の Python オブジェクトが与えられた場合、このオブジェクトが持つすべてのメソッドのリストを取得する簡単な方法はありますか?

または、

これが不可能な場合、メソッドが呼び出されたときにエラーが発生するかどうかを単に確認する以外に、特定のメソッドがあるかどうかを確認する簡単な方法は少なくともありますか?

4

22 に答える 22

652

多くのオブジェクトでは、次のコードを使用して、「オブジェクト」を目的のオブジェクトに置き換えます。

object_methods = [method_name for method_name in dir(object)
                  if callable(getattr(object, method_name))]

私は、 divintopython.net (現在はアーカイブされています)でそれを発見しました。うまくいけば、それはさらに詳細を提供するはずです!

を取得した場合はAttributeError、代わりにこれを使用できます

getattr(pandas スタイルの python3.6 抽象仮想サブクラスを許容しません。このコードは上記と同じことを行い、例外を無視します。

import pandas as pd
df = pd.DataFrame([[10, 20, 30], [100, 200, 300]],
                  columns=['foo', 'bar', 'baz'])
def get_methods(object, spacing=20):
  methodList = []
  for method_name in dir(object):
    try:
        if callable(getattr(object, method_name)):
            methodList.append(str(method_name))
    except Exception:
        methodList.append(str(method_name))
  processFunc = (lambda s: ' '.join(s.split())) or (lambda s: s)
  for method in methodList:
    try:
        print(str(method.ljust(spacing)) + ' ' +
              processFunc(str(getattr(object, method).__doc__)[0:90]))
    except Exception:
        print(method.ljust(spacing) + ' ' + ' getattr() failed')

get_methods(df['foo'])
于 2008-08-29T15:09:05.667 に答える
307

組み込みdir()関数を使用して、モジュールが持つすべての属性のリストを取得できます。コマンドラインでこれを試して、どのように機能するかを確認してください。

>>> import moduleName
>>> dir(moduleName)

また、hasattr(module_name, "attr_name")関数を使用して、モジュールに特定の属性があるかどうかを調べることもできます。

詳細については、Python イントロスペクションのガイドを参照してください。

于 2008-08-29T15:36:55.727 に答える
128

最も簡単な方法は、 を使用することdir(objectname)です。そのオブジェクトで使用可能なすべてのメソッドが表示されます。クールなトリック。

于 2013-11-20T16:06:27.423 に答える
38

私はあなたがこのようなものを望んでいると信じています:

オブジェクトの属性のリスト

組み込み関数dir()は、この仕事を行うことができます。

help(dir)Python シェルの出力から取得:

ディレクトリ(...)

dir([object]) -> list of strings

引数なしで呼び出された場合、現在のスコープ内の名前を返します。

それ以外の場合は、指定されたオブジェクトの属性 (の一部) とそこから到達可能な属性を含む名前のアルファベット順のリストを返します。

オブジェクトが という名前のメソッドを提供する場合__dir__、それが使用されます。それ以外の場合、デフォルトの dir() ロジックが使用され、以下が返されます。

  • モジュール オブジェクトの場合: モジュールの属性。
  • クラスオブジェクトの場合: その属性、および再帰的にそのベースの属性。
  • 他のオブジェクトの場合: その属性、そのクラスの属性、および再帰的にそのクラスの基本クラスの属性。

例えば:

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> a = "I am a string"
>>>
>>> type(a)
<class 'str'>
>>>
>>> dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__',
'__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'_formatter_field_name_split', '_formatter_parser', 'capitalize',
'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find',
'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace',
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition',
'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip',
'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',
'translate', 'upper', 'zfill']
于 2016-05-26T14:58:48.840 に答える
34

特定のメソッドがあるかどうかを確認するには:

hasattr(object,"method")
于 2008-08-29T15:40:05.017 に答える
27

より直接的な答えに加えて、 IPythonについて言及しなかった場合、私は気が進まないでしょう。

Tabオートコンプリートを使用して、使用可能なメソッドを表示するには、ヒットします。

方法を見つけたら、次のことを試してください。

help(object.method)

pydocs、メソッド シグネチャなどを表示します。

ああ... REPL

于 2008-08-29T15:47:04.517 に答える
17

特にメソッドが必要な場合は、 inspect.ismethodを使用する必要があります。

メソッド名の場合:

import inspect
method_names = [attr for attr in dir(self) if inspect.ismethod(getattr(self, attr))]

メソッド自体の場合:

import inspect
methods = [member for member in [getattr(self, attr) for attr in dir(self)] if inspect.ismethod(member)]

場合inspect.isroutineによっては便利な場合もあります (組み込み、C 拡張機能、「バインディング」コンパイラ ディレクティブのない Cython の場合)。

于 2015-01-29T17:10:18.240 に答える
16

Python があるとしobjます。__次に、 ( magic methods )で囲まれたメソッドを含むすべてのメソッドを表示します。

print(dir(obj))

魔法のビルトインを除外するには、次のようにします。

[m for m in dir(obj) if not m.startswith('__')]
于 2020-12-07T17:38:27.047 に答える
10

ここで示したすべてのメソッドの問題は、メソッドが存在しないことを確認できないことです。

__getattr__Python では、とを介してドット呼び出しをインターセプトできるため、__getattribute__「実行時に」メソッドを作成できます。

例:

class MoreMethod(object):
    def some_method(self, x):
        return x
    def __getattr__(self, *args):
        return lambda x: x*2

実行すると、オブジェクト辞書に存在しないメソッドを呼び出すことができます...

>>> o = MoreMethod()
>>> o.some_method(5)
5
>>> dir(o)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'some_method']
>>> o.i_dont_care_of_the_name(5)
10

Python のパーミッション パラダイムよりも簡単に許しを求める方法を使用するのはそのためです。

于 2014-12-09T14:02:06.227 に答える
1

...メソッドが呼び出されたときにエラーが発生するかどうかを単に確認する以外に、特定のメソッドがあるかどうかを確認する簡単な方法は少なくともありますか

許可よりも許しを求める方が簡単」は確かにPythonicの方法ですが、次のことを探しているかもしれません:

d={'foo':'bar', 'spam':'eggs'}
if 'get' in dir(d):
    d.get('foo')
# OUT: 'bar'
于 2013-03-26T14:51:55.917 に答える
1

getAttrsオブジェクトの呼び出し可能なプロパティ名を返す関数を作成できます

def getAttrs(object):
  return filter(lambda m: callable(getattr(object, m)), dir(object))

print getAttrs('Foo bar'.split(' '))

それは戻るだろう

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
 '__delslice__', '__eq__', '__format__', '__ge__', '__getattribute__', 
 '__getitem__', '__getslice__', '__gt__', '__iadd__', '__imul__', '__init__', 
 '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', 
 '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', 
 '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', 
 '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 
 'remove', 'reverse', 'sort']
于 2015-04-24T15:37:28.200 に答える
0

これは素晴らしいワンライナーです(ただし、属性も取得します):

print(*dir(obj), sep='\n')
于 2021-05-23T18:11:22.137 に答える
0

たとえば、シェルプラスを使用している場合は、代わりにこれを使用できます。

>> MyObject??

そのように、「??」オブジェクトの直後に、クラスが持つすべての属性/メソッドが表示されます。

于 2020-04-13T14:19:36.773 に答える