1

重複の可能性:
python クラス属性を調べる

クラスで定義されたすべての属性の名前のきれいなリストを取得する必要があります。次のクラスがあるとしましょう:

class MyClass(object):
    attr1 = None
    attr2 = 2
    attr3 = "Hello world"

私ができることがあるかどうか知りたいです:

>>> some_method(MyClass)  # <- check class
['attr1', 'attr2', 'attr3']
>>> my_class = MyClass()
>>> some_method(my_class)  # <- check instance of MyClass
['attr1', 'attr2', 'attr3']

などのdir属性や、クラスが持つメソッドも返すため、組み込みメソッドに頼ることはできません。つまり、クラスで定義された属性のみを取得する必要があり、組み込みの属性もメソッドも取得する必要はありません。__class____getattr__

それは可能ですか?dirまたは、リストの戻り値をループしていくつかのfilteringを作成できるように、どの属性が組み込みで、どの属性が私によって定義されているかを知る方法はありますか?

助けてくれてありがとう!!

4

4 に答える 4

5

これが出発点です。

>>> [x for x in dir(a) if not x in dir(super(type(a)))]
['__dict__', '__module__', '__weakref__', 'attr1', 'attr2', 'attr3']

dir親クラスのものではないオブジェクトのすべてを返しますdir

それがうまくいくことの1つは、クラスで定義されたメソッドを除外することですが、たまたま関数であるインスタンス属性には触れません。

于 2012-11-22T18:03:03.263 に答える
2

これを行うには、 inspectモジュールを使用できます。

次に例を示します。

>>> import inspect
>>> filter(lambda x: not (x.startswith('__') and x.endswith('__')), [a for (a, b) in inspect.getmembers(MyClass, lambda x : (not inspect.ismethod(x) and not inspect.isbuiltin(x)) )])
['attr1', 'attr2', 'attr3']

基本的な考え方はinspect.getmembers、あるオブジェクトのすべてのメンバーを取得するために実行することです。これは、オブジェクトとクラスの両方をサポートします。メソッドとビルトインは、 へのオプションの引数として提供される述語ラムダ式を使用してフィルタリングされますinspect.getmembers。次に、リスト内包表記を使用して各メンバーの名前だけを取得し、最後__dict__に Python フィルター関数を使用して etc をフィルター処理します。

etcのフィルタリング__dict__はあまり「科学的」ではありませんが、ほとんどの場合はそうすべきだと思います:)

于 2012-11-22T18:13:59.840 に答える
2

関数は属性であり、後で追加の関数をクラスまたはインスタンスに割り当てることを妨げるものは何もありません。したがって、関数ではなく、「特別」ではないすべての属性をリストできるかどうかを尋ねています。

クラスまたはインスタンスで直接定義されているものをリストしたい場合は、.__dict__代わりにマッピングを見てください。あなたはまだそれをフィルタリングする必要があります:

import types

def objectAttributes(obj):
    for key, val in obj.__dict__.iteritems():
        if not isinstance(val, (types.FunctionType, types.MethodType)):
            yield key

これにより、関数またはメソッドではないすべての属性名が生成されます。これは、クラスと、メソッドが手動で割り当てられたインスタンスの両方で機能するはずです。

リストを出力として取得するには、list(objectAttributes(MyClass))またはを呼び出しますlist(objectAttributes(myinstance))

このメソッドは基本クラスをトラバースしない__slots__ため、クラスで使用すると機能しなくなります。

于 2012-11-22T18:02:03.517 に答える
0
t = MyClass()
result = []
for k,v in t.__dict__.items(): #all members of MyClass
    if not hasattr(v, '__call__'):#if it's not  a callable 
        result.append(k)
于 2012-11-22T18:03:57.923 に答える