【问题标题】:Loop over all variables in class that acts like enum循环遍历类中所有类似于枚举的变量
【发布时间】:2013-11-13 00:15:03
【问题描述】:

我有一个类似于枚举的类。 我想遍历他的变量(枚举值)

class Demos(object):
    class DemoType(object):
        def __init__(self, name):
            self.name = name

        def __repr__(self):
            return self.name

    VARIABLE1 = DemoType("Car")
    VARIABLE2 = DemoType("Bus")
    VARIABLE3 = DemoType("Example")
    VARIABLE4 = DemoType("Example2")

我考虑过使用Role.__dict__vars(Role),但它们不仅包含变量,还包含RoleType 类和其他属性,如__module____doc__ 等等...

我也希望它是这样表示的,主要是因为它会给DemoType添加更多变量。 name以外的变量,所以请尝试通过这种方式找到答案。

【问题讨论】:

标签: python python-2.7 enums python-2.x


【解决方案1】:

与其重新发明枚举类型,不如使用 Python 的 Enum 类型(也曾是 backported)。然后你的代码可能看起来像

class Demos(Enum):
    VARIABLE1 = "Car"
    VARIABLE2 = "Bus"
    VARIABLE3 = "Example"
    VARIABLE4 = "Example2"


--> for variable in Demos:
...    print variable

【讨论】:

  • 你能用这个方法给一个变量添加更多吗?比如,做VARIABLE1,并添加名称Car,以及描述"A type of vehicle with 4 wheels"?
  • @Nirock:是的,新的Enum 类型非常强大。查看this answer 以获取轻松支持文档字符串的AutoEnum 配方。
  • =\,我需要的不止这些。我的枚举代表TF2 Roles。所以它就像DemomanSoldierScoutMedic。我需要为每个角色添加一个 max_players 值。这就是我使用这种模式的原因:stackoverflow.com/questions/19542862/…
  • @Nirock:你为什么不问一个新问题,How do I use Python's new Enum for ...,列出一堆你需要/想要的属性和方法,然后有人可以帮忙?
【解决方案2】:

我找到了答案,而且它根本不是 How can I represent an 'Enum' in Python? 的副本。 答案是通过以下list comprehensive创建以下list

variables = [attr for attr in dir(Demos()) if not attr.startswith("__") and not callable(attr)]
print variables 

我也可以通过这种方式为我创建一个函数:

class Demos(object):
    class DemoType(object):
        def __init__(self, name):
            self.name = name

        def __repr__(self):
            return self.name

    @classmethod
    def get_variables(cls):
        return [getattr(cls, attr) for attr in dir(cls) if not callable(getattr(cls, attr)) and not attr.startswith("__")]

    VARIABLE1 = DemoType("Car")
    VARIABLE2 = DemoType("Bus")
    VARIABLE3 = DemoType("Example")
    VARIABLE4 = DemoType("Example2")


for variable in Demos.get_variables():
    print variable

【讨论】:

  • 这应该是类方法而不是实例方法
  • class methodstatic method 对于这种情况?
  • classmethod,我认为您需要访问班级成员
  • 好的,一点研究告诉我你是对的。我现在就修。
  • @newtover 因为除了你之外没有人积极参与我的问题,所以我必须亲自问你是否有任何改进答案的想法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 2012-07-04
  • 2019-01-06
  • 1970-01-01
相关资源
最近更新 更多