11

組み込みではないカスタムクラスの属性(たとえば、など)のみを反復処理する別の方法はあり__dict__ます__module__か?たとえば、次のコードでは次のようになります。

class Terrain:
    WATER = -1
    GRASS = 0
    HILL = 1
    MOUNTAIN = 2

次のように、これらすべての属性を繰り返すことができます。

for key, value in Terrain.__dict__.items():
    print("{: <11}".format(key), " --> ", value)

出力:

MOUNTAIN     -->  2
__module__   -->  __main__
WATER        -->  -1
HILL         -->  1
__dict__     -->  <attribute '__dict__' of 'Terrain' objects>
GRASS        -->  0
__weakref__  -->  <attribute '__weakref__' of 'Terrain' objects>
__doc__      -->  None

整数引数(列挙型の基本バージョン)が必要な場合は、次のように使用できます。

for key, value in Terrain.__dict__.items():
    if type(value) is int: # type(value) == int
        print("{: <11}".format(key), " --> ", value)

これにより、期待される結果が得られます。

MOUNTAIN    -->  2
WATER       -->  -1
HILL        -->  1
GRASS       -->  0

たとえば、属性がすべて統合されていない場合など、タイプに関係なく、カスタムクラスの組み込みでない属性のみを反復処理することは可能ですか。おそらく、条件を拡張してより多くのタイプを含めることができますが、他に欠けている方法があるかどうかを知りたいです。

4

3 に答える 3

19

私は使うだろう:

for key, value in Terrain.__dict__.items():
    if not key.startswith("__"):
        print(...)

または、私が望むことを実行する実際の列挙型を作成します。

于 2012-07-07T03:09:35.043 に答える
3

あなたはこのようなことを試すことができます:

class GenericClass(object): pass
class_builtins = set(dir(GenericClass))

terrain_attributes = {attr: getattr(Terrain, attr) for attr in dir(Terrain) if attr not in class_builtins}
于 2012-07-07T03:24:16.617 に答える
1

組み込み属性は「__」で開始および終了する必要があるため、次のようになります。

[(k,v) for k,v in Terrain.__dict__.items() if not (k.startswith('__')
    and k.endswith('__'))]

__attributes__このコードが適切に機能しないように、独自に作成することを好む人もいます。この名前空間が予約されているのには理由があります

また、チェックする必要があります__slots__

于 2012-07-07T04:50:02.470 に答える