有没有其他方法可以遍历自定义类的属性,不包括内置的属性?

2024-04-28 02:16:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如果我只需要整数参数(枚举类型的rudimentary version),可以使用:

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

是否可以只遍历独立于类型的自定义类的非内置属性,例如,如果这些属性不是所有的整数。大概我可以扩展条件以包含更多类型,但我想知道是否有其他方法我遗漏了。


Tags: 方法keyin类型for属性value内置
3条回答

我会用:

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

或者我创建一个实际的枚举类型来实现我想要的功能。

内置属性应该以“\uuu”开头和结尾,因此:

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

有些人喜欢创建自己的__attributes__,这样代码就不能正常工作。嘿,这个名称空间之所以被保留是有原因的

您还需要检查__slots__

你可以试试这样的:

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}

相关问题 更多 >