クラスの属性を取得したいとします。
class MyClass():
a = "12"
b = "34"
def myfunc(self):
return self.a
using は、MyClass.__dict__
属性と関数のリスト、さらには や__module__
のような関数も返します__doc__
。while は、MyClass().__dict__
そのインスタンスの属性値を明示的に設定しない限り、空の辞書を返します。
必要なのは属性だけです。上記の例では、次のようになりますa
。b
ベストアンサー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')]
...さらに複雑なものとしては、特殊な属性名のチェックやメタクラスなどが含まれる場合があります ;)