これは私の実際の問題の単純化された例です。
私はfoo
このように定義されたクラスを持っていますfoo.py
:
class foo(object):
def __init__(self):
pass
def bar(self):
return True
@property
def baz(self):
return False
ここで、inspect
モジュールを使用してfoo
クラスのメソッド(を含むbaz
)を取得したいと思います。これは私がこれまでに持っているものですgetmethods.py
:
import foo
import inspect
classes = inspect.getmembers(foo, inspect.isclass)
for cls in classes:
methods = inspect.getmembers(cls[1], inspect.ismethod)
print methods
このスクリプトを実行すると、次の出力が得られます(これはまったく予期しないことではありません)。
[('__init__', <unbound method foo.__init__>), ('bar', <unbound method foo.bar>)]
だから、私の質問は、なぜ正確にbaz
メソッドと見なされないのかgetmethods.py
、そして次の出力を取得するためにどのように変更できるのかということです。
[('__init__', <unbound method foo.__init__>), ('bar', <unbound method foo.bar>), ('baz', <property object at 0x7fbc1a73d260>)]
@property
デコレータは生成property
オブジェクトではなく、関数またはメソッドを。それが中に記憶された関数を呼び出し、このオブジェクトであり.fget
、.fset
そして.fdel
(を通じてアクセスするとき、そのオブジェクトの属性記述プロトコル)。
そのオブジェクトタイプを明示的にテストする必要があります。
methods = inspect.getmembers(cls[1], inspect.ismethod)
properties = inspect.getmembers(cls[1], lambda o: isinstance(o, property))
または
methods_and_properties = inspect.getmembers(
cls[1], lambda o: isinstance(o, (property, types.MethodType)))
同じ制限を適用することを注記classmethod
してstaticmethod
オブジェクト。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加