【问题标题】:List methods of a class but not sorted alphabetically列出类的方法,但不按字母顺序排序
【发布时间】:2014-08-10 18:41:06
【问题描述】:

dir() 函数返回方法的列表,但是:

结果列表按字母顺序排序

我想知道哪些是按字母顺序排列的。我用这个名字来帮助理解这个方法是做什么的。我使用像 game_start、game_battle、game_map 这样的名称。我可以将名称更改为开始、战斗、地图,但如果我想对 tkinter 应用程序中的所有其他方法使用相同的提交方法。所以我需要按照声明的顺序来评估方法的名称。

还有其他解决方法吗?

示例:

class hi(object):
    def __init__(self):
        self.name="LLopis"
    def question(self):
        print("Question?")
    def answer(self):
        print("Answer")

dir(hi) 的结果是:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'answer', 'question']

我想要一个返回的函数(或私有方法的内部顺序,但按查找顺序):

['__init__', 'question', 'answer']

编辑:我不关心 hi.name 之类的属性,因此虽然 this question 是相关的,但它并不是完全重复的。

【问题讨论】:

  • “内部”订单是字典,因此未排序
  • 为什么按字母顺序排序是个问题?你想要它们在源代码中出现的顺序吗?如果是这样,您想以何种方式实现这一目标?
  • 我想按照我在类中编写它们的顺序使用我定义的方法,但我不想用想要的顺序定义一个列表或更改方法的名称。
  • 你用的是什么版本的 Python?
  • “我不想用想要的顺序定义一个列表或更改方法的名称。”我想不出这会成为主要问题的场景。

标签: python


【解决方案1】:

在执行程序时,解释器 (CPython) 不会保留声明类方法的顺序,因此除了查看源代码之外,无法在运行时找到它。

附:但请参阅下面 cmets 中 @Jon Clements 的评论。

【讨论】:

  • 不完全正确 - 如果 OP 使用 Python 3.x,带有元类的 __prepare__ 可用于返回自定义字典(例如 OrderedDict) - 有一些 hack-arounds在 2.x 中也可用
  • @JonClements:很公平。我将添加一条指向您的评论的评论。 :-)
  • @JonClements:顺便说一句,请随时写出更好的答案。我很乐意支持并删除我的,因为它显然是半生不熟的。
【解决方案2】:

对于 CPython,您可以使用 fistrlineno 属性:

fns = []
for p in dir(hi):
    a = getattr(hi, p)
    if hasattr(a, '__code__'):
        fns.append((a.__code__.co_firstlineno, p))


print([x[1] for x in sorted(fns)])  # ['__init__', 'question', 'answer']

【讨论】:

【解决方案3】:

自己编译源代码(使用inspect访问)到抽象语法树(AST),然后列出方法名称:

import ast, inspect
codeobj = compile(inspect.getsource(hi), "<string>", "exec", flags=ast.PyCF_ONLY_AST)
methods = [_.name for _ in codeobj.body[0].body]
print(methods) # ['__init__', 'question', 'answer']

这仅在您将代码保存到文件时才有效,而不是在 IDLE 中,但我假设您无论如何都在这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2020-03-29
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多