4

varsキーワードは、インスタンス内のすべての変数を示します。たとえば、次のようになります。

In [245]: vars(a)
Out[245]: {'propa': 0, 'propb': 1}

ただし、クラスで定義されているすべての呼び出し可能なメンバーをリストする単一のソリューションを認識していません (たとえば、ここを参照してください:オブジェクトが持つメソッドの検索)、除外するこの単純な改善を追加しました__init__:

In [244]: [method for method in dir(a) if callable(getattr(a, method)) and not method.startswith('__')]
Out[244]: ['say']

比較:

In [243]: inspect.getmembers(a)
Out[243]:
[('__class__', __main__.syncher),
 ('__delattr__',
  <method-wrapper '__delattr__' of syncher object at 0xd6d9dd0>),
 ('__dict__', {'propa': 0, 'propb': 1}),
 ('__doc__', None),
 ...snipped ...
 ('__format__', <function __format__>),
 ('__getattribute__',
  <method-wrapper '__getattribute__' of syncher object at 0xd6d9dd0>),
 ('__hash__', <method-wrapper '__hash__' of syncher object at 0xd6d9dd0>),
 ('__init__', <bound method syncher.__init__ of <__main__.syncher object at 0xd6d9dd0>>),
 ('__module__', '__main__'),
 ('__setattr__',
  <method-wrapper '__setattr__' of syncher object at 0xd6d9dd0>),
 ('__weakref__', None),
 ('propa', 0),
 ('propb', 1),
 ('say', <bound method syncher.say of <__main__.syncher object at 0xd6d9dd0>>)]

または例:

In [248]: [method for method in dir(a) if callable(getattr(a, method)) 
                and isinstance(getattr(a, method), types.MethodType)]
Out[248]: ['__init__', 'say']

また、組み込みルーチンを除外するこの方法も見つけました。

In [258]: inspect.getmembers(a, predicate=inspect.ismethod)
Out[258]:
[('__init__',
  <bound method syncher.__init__ of <__main__.syncher object at 0xd6d9dd0>>),
 ('say', <bound method syncher.say of <__main__.syncher object at 0xd6d9dd0>>)]

__init__だから、私の質問は: Python 2.7.X でクラス内のすべてのメソッド ( とすべての組み込みメソッドを除く) を見つけるより良い方法はありますか?

4

1 に答える 1

2

他の誰もより良い解決策を提供しなかったので、Pythonic の方法は Python の STL を使用することになると思います。

inspect.getmembers(a, predicate=inspect.ismethod)

init を除外するには、 を使用できますfilter

于 2015-02-28T09:25:59.510 に答える