Pythonオブジェクトが持つメソッドを見つける


430

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

または、

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


回答:


524

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

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

私はそれをdiveintopython.netで発見しました(アーカイブ済み)。うまくいけば、それはいくつかの詳細を提供するはずです!

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

getattr(パンダスタイルの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: 
        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: 
        print(method.ljust(spacing) + ' ' + ' getattr() failed') 


get_methods(df['foo']) 

3
これはリストの内包であり、methodのリストを返します。methodはdir(object)によって返されたリスト内のアイテムであり、getattr(object、method)がcallableを返した場合にのみ、各メソッドがリストに追加されます。
Mnebuerquo

1
これをどのように正確に使用しますか?メソッドのリストを印刷すると言います。
湿地

12
@marshメソッドを出力するには:print [method for method in dir(object) if callable(getattr(object, method))]
Orienteerix

1
私は、ANを取得していますAttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'、私はこれを実行しようとします。詳細については、stackoverflow.com / q / 54713287/9677043をご覧ください。
カールベイカー

1
Python 3.6のpandasデータフレームオブジェクトでは機能しません。
Stefan Karlsson

226

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

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

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

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


hasattr私のユースケースがpythonオブジェクトに特定のメンバー変数またはメソッドがあるかどうかを見つけるのに役立ちました。
Akshay 2017

なぜこのソリューションが十分に賛成されていないのか、私にはわかりません。これは簡潔で正確です。
Prasad Raghavendra

93

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


3
また、オブジェクトの属性も表示されるため、メソッドを具体的に検索する場合は機能しません。
エリック

はい。同意した。しかし、メソッドのリストのみを取得する他の手法は知りません。多分最良のアイデアは、属性とメソッドの両方のリストを取得し、<hasattr(object、 "method_name">を使用してさらにフィルターで除外することですか?
Pawan Kumar

1
@neuronet、私は受け入れられた答えを実行しようとしていますが、を取得していAttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'ます。何か案は?stackoverflow.com/q/54713287/9677043で deetsを参照してください 。@Pawan Kumar b / cに+1すると答えが機能し、@ ljsにするとメソッドのみのフィルターされたリストが約束されます。
カールベイカー

30

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

hasattr(object,"method")

14
OPは方法を探しているだけでなく、属性されているので、私はあなたと更なるステップに行きたいと思う:if hasattr(obj,method) and callable(getattr(obj,method)):
ブルーノBronosky

28

私はあなたが望むものはこのようなものだと信じています:

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

私の控えめな意見では、組み込み関数dir()はあなたのためにこの仕事をすることができます。help(dir)Pythonシェルの出力から取得:

dir(...)

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']

私はあなたの問題をチェックしていたので、の出力をより適切にフォーマットして、私の一連の考えを示すことにしましたdir()

dir_attributes.py(Python 2.7.6)

#!/usr/bin/python
""" Demonstrates the usage of dir(), with better output. """

__author__ = "ivanleoncz"

obj = "I am a string."
count = 0

print "\nObject Data: %s" % obj
print "Object Type: %s\n" % type(obj)

for method in dir(obj):
    # the comma at the end of the print, makes it printing 
    # in the same line, 4 times (count)
    print "| {0: <20}".format(method),
    count += 1
    if count == 4:
        count = 0
        print

dir_attributes.py(Python 3.4.3)

#!/usr/bin/python3
""" Demonstrates the usage of dir(), with better output. """

__author__ = "ivanleoncz"

obj = "I am a string."
count = 0

print("\nObject Data: ", obj)
print("Object Type: ", type(obj),"\n")

for method in dir(obj):
    # the end=" " at the end of the print statement, 
    # makes it printing in the same line, 4 times (count)
    print("|    {:20}".format(method), end=" ")
    count += 1
    if count == 4:
        count = 0
        print("")

私が貢献したことを願っています:)。


1
貢献した?あなたの答えはPython 2.7.12で私のために働いたので、そうです!
gsamaras

23

より直接的な回答に加えて、iPythonについて言及しなかった場合、私は見逃してしまいます。「タブ」を押すと、オートコンプリートで使用可能なメソッドが表示されます。

そして、メソッドを見つけたら、以下を試してください:

help(object.method) 

pydocs、メソッドシグネチャなどを確認する

ああ... REPL


12

特にメソッドが必要な場合は、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の場合)場合によっても役立つことがあります。


リスト内包表記のinspect.getmembers代わりに使用するべきではありませんdirか?
ボリス

はい、それはより良いようです!
paulmelnikow

11

bashシェルを開きます(Ubuntuではctrl + alt + T)。その中でpython3シェルを起動します。メソッドを観察するオブジェクトを作成します。その後ろにドットを追加し、「Tab」を2回押すと、次のようなものが表示されます。

 user@note:~$ python3
 Python 3.4.3 (default, Nov 17 2016, 01:08:31) 
 [GCC 4.8.4] on linux
 Type "help", "copyright", "credits" or "license" for more information.
 >>> import readline
 >>> readline.parse_and_bind("tab: complete")
 >>> s = "Any object. Now it's a string"
 >>> s. # here tab should be pressed twice
 s.__add__(           s.__rmod__(          s.istitle(
 s.__class__(         s.__rmul__(          s.isupper(
 s.__contains__(      s.__setattr__(       s.join(
 s.__delattr__(       s.__sizeof__(        s.ljust(
 s.__dir__(           s.__str__(           s.lower(
 s.__doc__            s.__subclasshook__(  s.lstrip(
 s.__eq__(            s.capitalize(        s.maketrans(
 s.__format__(        s.casefold(          s.partition(
 s.__ge__(            s.center(            s.replace(
 s.__getattribute__(  s.count(             s.rfind(
 s.__getitem__(       s.encode(            s.rindex(
 s.__getnewargs__(    s.endswith(          s.rjust(
 s.__gt__(            s.expandtabs(        s.rpartition(
 s.__hash__(          s.find(              s.rsplit(
 s.__init__(          s.format(            s.rstrip(
 s.__iter__(          s.format_map(        s.split(
 s.__le__(            s.index(             s.splitlines(
 s.__len__(           s.isalnum(           s.startswith(
 s.__lt__(            s.isalpha(           s.strip(
 s.__mod__(           s.isdecimal(         s.swapcase(
 s.__mul__(           s.isdigit(           s.title(
 s.__ne__(            s.isidentifier(      s.translate(
 s.__new__(           s.islower(           s.upper(
 s.__reduce__(        s.isnumeric(         s.zfill(
 s.__reduce_ex__(     s.isprintable(       
 s.__repr__(          s.isspace(           

1
このような回避策について話している間に、を実行しipythonてオブジェクトの入力を開始し、を押すことでも同様に機能することを追加しますtab。readline設定は不要
Max Coplan

1
@MaxCoplanデフォルトでタブ補完が有効になっていない場合の回避策をコードに追加しました
Valery Ramusik

8

ここに示されているすべてのメソッドの問題は、メソッドが存在しないことを確信できないことです。

Pythonでは、ドット呼び出しをインターセプトして__getattr____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の許可パラダイムよりも簡単に許しを求めるための理由です。


6

オブジェクトのメソッドのリストを取得する最も簡単な方法は、help()コマンドを使用することです。

%help(object)

そのオブジェクトに関連付けられているすべての使用可能な/重要なメソッドが一覧表示されます。

例えば:

help(str)

%最初の例では何をしますか?私のPython 2.7では動作しません。
Scorchio

@Scorchio Pythonのプロンプトとして「%」を ">>>」の代わりに使用しました。コマンドを実行する前に%を取り除くことができます。
Paritosh Vyas

3
import moduleName
for x in dir(moduleName):
print(x)

これはうまくいくはずです:)


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']

1

すべてのオブジェクトのメソッドをリストする信頼できる方法はありません。dir(object)通常は便利ですが、すべてのメソッドがリストされない場合もあります。よるとdir()ドキュメント「引数を指定すると、しようとしているオブジェクトに対して有効な属性のリストを返すように。」

メソッドが存在することの確認はcallable(getattr(object, method))、すでにそこに記述されているように実行できます。


1

リストをオブジェクトとして受け取る

obj = []

list(filter(lambda x:callable(getattr(obj,x)),obj.__dir__()))

あなたが得る:

['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__delitem__',
 '__dir__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__iadd__',
 '__imul__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__reversed__',
 '__rmul__',
 '__setattr__',
 '__setitem__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'append',
 'clear',
 'copy',
 'count',
 'extend',
 'index',
 'insert',
 'pop',
 'remove',
 'reverse',
 'sort']

0

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

許可よりも許しを求める方が簡単」は確かにPythonのやり方ですが、あなたが探しているものは多分:

d={'foo':'bar', 'spam':'eggs'}
if 'get' in dir(d):
    d.get('foo')
# OUT: 'bar'

0

モジュール全体で特定のメソッドを検索するには

for method in dir(module) :
  if "keyword_of_methode" in method :
   print(method, end="\n")

-1

たとえば、shell plusを使用している場合は、代わりにこれを使用できます。

>> MyObject??

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.