正在从具有多重继承的类中检索参数



是否可以使用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:]

编辑:

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

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

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

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

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

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

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

您可能需要先阅读python Mixins。

通常,使用名称冲突的两个类来使用多重继承是非常糟糕的形式。最左边的类总是按优先级排列,这会导致其他使用重写方法的类中的方法出现一些奇怪的情况。

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

class Foo(object):
    def __init__(self, **kwargs):
        for k, v in kwargs.iteritems():
            setattr(self, k, v)

最新更新