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是相关的,但它并不完全相同。
答案 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中的情况,但我认为无论如何都要这样做。