クラスの属性を取得する 質問する

クラスの属性を取得する 質問する

クラスの属性を取得したいとします。

class MyClass():
  a = "12"
  b = "34"

  def myfunc(self):
    return self.a

using は、MyClass.__dict__属性と関数のリスト、さらには や__module__のような関数も返します__doc__。while は、MyClass().__dict__そのインスタンスの属性値を明示的に設定しない限り、空の辞書を返します。

必要なのは属性だけです。上記の例では、次のようになりますab

ベストアンサー1

試してみてください検査するモジュール。getmembersそしてさまざまなテストが役立つはずです。

編集:

例えば、

class MyClass(object):
    a = '12'
    b = '34'
    def myfunc(self):
        return self.a

>>> import inspect
>>> inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a)))
[('__class__', type),
 ('__dict__',
  <dictproxy {'__dict__': <attribute '__dict__' of 'MyClass' objects>,
   '__doc__': None,
   '__module__': '__main__',
   '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
   'a': '34',
   'b': '12',
   'myfunc': <function __main__.myfunc>}>),
 ('__doc__', None),
 ('__module__', '__main__'),
 ('__weakref__', <attribute '__weakref__' of 'MyClass' objects>),
 ('a', '34'),
 ('b', '12')]

さて、特殊なメソッドと属性は私をいらいらさせます。これらはいくつかの方法で対処できますが、最も簡単な方法は名前に基づいてフィルタリングすることです。

>>> attributes = inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a)))
>>> [a for a in attributes if not(a[0].startswith('__') and a[0].endswith('__'))]
[('a', '34'), ('b', '12')]

...さらに複雑なものとしては、特殊な属性名のチェックやメタクラスなどが含まれる場合があります ;)

おすすめ記事