【问题标题】:How to get list of class variables in the order they are defined?如何按定义的顺序获取类变量列表?
【发布时间】:2016-11-18 20:08:26
【问题描述】:

我有一个类将 csv 文件的列布局指定为:

class RecordLayout(object):
    YEAR = 0
    DATE = 1
    MONTH = 2
    ID = 3
    AGE = 4
    SALARY = 5

我需要按照定义的顺序获取类变量的列表。

到目前为止,我尝试过:

[attr for attr in dir(RecordLayout()) if not callable(attr) and not attr.startswith("__")]

但它会返回:

['AGE', 'DATE', 'ID', 'MONTH', 'SALARY', 'YEAR']

这是按字母顺序排列的类变量。我需要按照它们在类中定义的顺序返回变量:

['YEAR', 'DATE', 'MONTH', 'ID', 'AGE', 'SALARY']

有没有办法做到这一点?

【问题讨论】:

  • “我需要按照定义的顺序返回变量” - 出于什么目的?
  • 它们的定义顺序不记得了,你需要用其他方式来做。
  • @jonrsharpe:获取列表中 csv 文件的标题。

标签: python list class variables


【解决方案1】:

您应该为此使用Enum

>>> class RecordLayout(Enum):
...     YEAR = 0
...     DATE = 1
...     MONTH = 2
...     ID = 3
...     AGE = 4
...     SALARY = 5
...
>>> for i in RecordLayout:
...   print(i)
...
RecordLayout.YEAR
RecordLayout.DATE
RecordLayout.MONTH
RecordLayout.ID
RecordLayout.AGE
RecordLayout.SALARY

【讨论】:

  • 谢谢丹。我可以做这样的事情 [name for name, member in RecordLayout.__members__.items()],它返回 ['YEAR', 'DATE', 'MONTH', 'ID', 'AGE', 'SALARY']。
【解决方案2】:

老问题,但在谷歌搜索结果中排名靠前,所以这是我经过更多研究后的答案。

使用RecordLayout().__dir__() 并过滤掉不需要的条目。 __dir__() 应该按照定义的顺序提供条目,而 dir() 应用排序。

我是怎么到这里的?

从“PEP 520 -- Preserving Class Attribute Definition Order”开始,然后在这个讨论帖https://mail.python.org/pipermail/python-dev/2016-September/146382.html结束

  >>> class Example:
  ...     def __dir__(self):
  ...         return "first second third fourth".split()
  ...
  >>> dir(Example())
  ['first', 'fourth', 'second', 'third']
  >>> Example().__dir__()
  ['first', 'second', 'third', 'fourth']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2016-10-02
    • 2011-05-12
    • 1970-01-01
    • 2019-05-28
    相关资源
    最近更新 更多