python - 从具有多重继承的类中检索参数

标签 python inheritance introspection

是否可以使用 inspect.getargspec() 或任何其他选项从具有多个父类的对象中检索所有参数?

例子:

import inspect

class One:
    def __init__(self,a):
        self.a = a

class Two:
    def __init__(self,b):
        self.b = b

class Three(One, Two):
    pass

print(inspect.getargspec(Three.__init__))

相反: ArgSpec(args=['self', 'a'], varargs=None, keywords=None, defaults=None) 作为输出,我正在寻找方法: ['self', 'a','b'] 参数。

最佳答案

args = ['self']
for C in Three.__mro__:
    if '__init__' in C.__dict__:
        args += inspect.getargspec(C).args[1:]

编辑:

作为对挠头的人的一点澄清:

self 会在调用 getargspec 时为所有绑定(bind)方法返回,因此一开始就将其作为默认值。这样我们就可以在任何地方跳过它(否则它会多次出现在列表中——也可以使用 set() 来避免这种情况)。

我们遍历类的方法解析顺序列表 (__mro__)。

在正常情况下,这个列表用于确定调用哪个函数,但在初始化的情况下,它告诉 super().__init__() 调用下一个(这就是为什么它是重要的是你总是打电话 - 即使你没有继承任何东西 - 它否则你会打断链)

对于我们返回的每个类类型,查看它是否有自己的 __init__

如果是,则对其运行 getargspec 函数,并将生成的参数名称列表添加到初始列表,跳过 self

注意:对于 python 3+,请改用 getfullargspec

关于python - 从具有多重继承的类中检索参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36994217/

相关文章:

css - 使用 LESS 重用代码

java - Java中通过继承类实现接口(interface)

javascript - 如何从 Javascript 获取所有函数和顶级名称

javascript - 对 Ember 应用程序进行反射(reflection)/内省(introspection)以查找特定模型的实例

python - 从别名函数中确定函数名称

python - 遍历 Python 列表中的每两个元素

python - pandas dataframe切片产生不同的结果

c++ - 检测 CRTP 基类的 sibling

python - FormView不更新但创建模型的新记录

python - 如何在 numpy 数组中使用 for 循环?