从具有多重继承的 class 检索参数

Retrieving arguments from a class with multiple inheritance

是否可以使用 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'] 参数。

您可能需要先阅读 python Mixins

一般来说,使用两个具有冲突名称的 class 元素来使用多重继承是一种非常糟糕的形式。最左边的 class 始终具有优先级,导致其他 class 使用覆盖方法的方法出现一些奇怪的事情。

如果您想要一个可变数量 args/kwargs 的对象,您应该指定它。

class Foo(object):

    def __init__(self, **kwargs):
        for k, v in kwargs.iteritems():
            setattr(self, k, v)
args = ['self']
for C in Three.__mro__:
    if '__init__' in C.__dict__:
        args += inspect.getargspec(C).args[1:]

编辑:

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

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

我们运行通过class'方法解析顺序列表(__mro__)。

在正常情况下,此列表用于确定调用哪个函数,但在初始化的情况下,它会告诉 super().__init__() 调用下一个调用(这就是为什么您始终调用很重要的原因 - 即使如果你不继承任何东西 - 它或者你会打断链)

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

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

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