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