是否有任何其他方法可以循环访问自定义类的属性,不包括内置属性



有没有另一种方法可以仅遍历非内置自定义类的属性(例如 __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

是否可以仅循环访问独立于类型的自定义类的非内置属性,例如,如果属性不是全部整数。大概我可以扩展条件以包含更多类型,但我想知道是否还有其他方法我缺少。

我会使用:

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

或者我会创建一个实际的枚举类型来执行我想要的操作。

你可以尝试这样的事情:

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}

内置属性应以"__"开头和结尾,因此:

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

有些人喜欢创建自己的__attributes__因此此代码无法正常工作。嘿,保留此命名空间是原因的

您还必须检查__slots__

最新更新