dir()
函数按字母顺序打印方法。有没有办法获取类的方法(及其参数)但保持方法的原始顺序?
这是我的代码
return [
(m, getattr(PythonClass, m).__code__.co_varnames)
for m in dir(PythonClass)
]
正如 @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'))]
显式优于隐式。如果要构建方法列表,请使用装饰器将它们显式添加到列表中。
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)