Python 反射:如何获取类方法的变量名?

5 投票
2 回答
4912 浏览
提问于 2025-04-15 20:58

我想获取一个类的方法的关键字参数的名字。我觉得我已经明白了怎么获取方法的名字,以及怎么获取某个特定方法的变量名,但我不太明白怎么把这些结合起来:

class A(object):
    def A1(self, test1=None):
        self.test1 = test1
    def A2(self, test2=None):
        self.test2 = test2
    def A3(self):
        pass
    def A4(self, test4=None, test5=None):
        self.test4 = test4
        self.test5 = test5

a = A()

# to get the names of the methods:

for methodname in a.__class__.__dict__.keys():
    print methodname

# to get the variable names of a specific method:

for varname in a.A1.__func__.__code__.co_varnames:
    print varname

# I want to have something like this:
for function in class:
    print function.name
    for varname in function:
        print varname

# desired output:
A1
self
test1
A2
self
test2
A3
self
A4
self
test4
test5

我需要把这些方法和它们的参数名字暴露给一个外部的API。我写了一个扭曲的应用程序来连接到这个API,这个应用程序需要通过API发布这些数据。

所以,我想我会使用类似这样的东西:

for methodname in A.__dict__.keys():
if not methodname.startswith('__'):
    print methodname
    for varname in A.__dict__[methodname].__code__.co_varnames:
        print varname

一旦周围的环境变得更稳定,我会考虑一个更好的解决方案。

2 个回答

10

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这些问题可能是因为我们写的代码有bug,或者是因为我们没有正确使用某些工具和库。解决这些问题的第一步就是要仔细检查代码,看看有没有拼写错误、语法错误或者逻辑错误。

另外,了解你使用的编程语言和工具的基本知识也很重要。这样可以帮助你更快地找到问题所在,并且在遇到困难时能更好地寻求帮助。

如果你在网上寻找解决方案,比如在StackOverflow上提问,记得把你的问题描述清楚,并附上相关的代码和错误信息。这样别人才能更好地理解你的问题,并给出有效的建议。

总之,编程是一个不断学习和解决问题的过程,遇到困难时不要气馁,慢慢来,总会找到解决办法的。

import inspect

for name, method in inspect.getmembers(a, inspect.ismethod):
    print name
    (args, varargs, varkw, defaults) = inspect.getargspec(method)
    for arg in args:
        print arg
5

好吧,直接在你做的基础上扩展一下:

for varname in a.__class__.__dict__['A1'].__code__.co_varnames:
    print varname

输出结果是:

self
test1

附言:老实说,我觉得这个可以做得更优雅一些……

比如,你可以把 a.__class__ 替换成 A,不过你应该知道这一点 ;-)

撰写回答