如何获取Python类的方法(带参数),同时保持方法的原始顺序?

问题描述 投票:0回答:2

dir()
函数按字母顺序打印方法。有没有办法获取类的方法(及其参数)但保持方法的原始顺序?

这是我的代码

return [
    (m, getattr(PythonClass, m).__code__.co_varnames)
    for m in dir(PythonClass)
]
python class methods
2个回答
3
投票

正如 @Barmar 在评论中提到的,您可以使用类的

__dict__
属性来访问其属性。由于 Python 3.7 字典键保证保留其插入顺序,因此通过迭代
PythonClass.__dict__
您可以按照定义顺序获取
PythonClass
的属性。使用
vars
函数而不是
__dict__
属性来访问属性字典也更惯用。要过滤方法的类属性,您可以使用
inspect.isfunction
来测试属性是否是函数:

from inspect import isfunction

class PythonClass:
    var = 1
    def method_b(self, b): ...
    def method_a(self, a): ...

print([
    (name, obj.__code__.co_varnames)
    for name, obj in vars(PythonClass).items() if isfunction(obj)
])

输出:

[('method_b', ('self', 'b')), ('method_a', ('self', 'a'))]

演示:https://ideone.com/rNMcYO


2
投票

显式优于隐式。如果要构建方法列表,请使用装饰器将它们显式添加到列表中。

def
语句一次运行一个,因此列表将按预期顺序构建。 (请注意,列表不需要是类变量,它可以存在于实际代码中任何有意义的地方。)

def add_name_and_args_to(lst: list[tuple[str, tuple[str, ...]]]):
    def decorator(func):
        lst.append((func.__name__, func.__code__.co_varnames))
        return func
    return decorator

class MyClass:
    some_list: list[tuple[str, tuple[str, ...]]] = []

    @add_name_and_args_to(some_list)
    def foo(self, arg)
        ...

    @add_name_and_args_to(some_list)
    def bar(self, arg1, arg2):
        ...

    def baz(self, arg): # no decorator, so this won't be listed
        ...

# prints [('foo', ('self', 'arg')), ('bar', ('self', 'arg1', 'arg2'))]
print(MyClass.some_list)
© www.soinside.com 2019 - 2024. All rights reserved.