home changes contents help options

258:オブジェクトにメソッドが存在するか調べる

実際にアクセスしてみて、属性として存在するかどうかを調べます。その後 callable 関数で調べます。 False が返ってこなければ呼び出し可能オブジェクトです。おそらく、メソッドでしょう。

>>> class X(object):
...   def a(self):
...     pass
...   b = None
...
>>> x = X()
>>> x.a
<bound method X.a of <__main__.X object at 0x00A62A30>>
>>> x.c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'X' object has no attribute 'c'
>>> callable(x.a)
True

インタラクティブシェルでもちいるならばこれで十分ですが、実際のプログラムで用いるにはもう一工夫したほうがよいでしょう。

>>> def exist_callable(obj, name):
...   try:
...     ret = callable(getattr(obj, name))
...   except AttributeError:
...     ret = False
...   return ret
...
>>> exist_callable(x, 'a')
True
>>> exist_callable(x, 'b')
False
>>> exist_callable(x, 'c')
False

真にメソッドであることを確認するには callable の代わりに inspect モジュールの ismethod 関数を用います。

>>> import inspect
>>> inspect.ismethod(x.a)
True
>>> inspect.ismethod(x.b)
False
>>>