列出类的方法但不按字母顺序排序

时间:2014-08-10 18:41:06

标签: python

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

  

结果列表按字母顺序排序

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

还有其他解决方法吗?

示例:

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是相关的,但它并不完全相同。

3 个答案:

答案 0 :(得分:3)

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

P.S。但请参阅以下评论中@Jon Clements的评论。

答案 1 :(得分:1)

具体到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']

答案 2 :(得分:0)

将源代码(使用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中的情况,但我认为无论如何都要这样做。

example run on my computer