【问题标题】:Retrieving arguments from a class with multiple inheritance从具有多重继承的类中检索参数
【发布时间】:2016-08-27 21:55:15
【问题描述】:

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


    【解决方案1】:
    args = ['self']
    for C in Three.__mro__:
        if '__init__' in C.__dict__:
            args += inspect.getargspec(C).args[1:]
    

    编辑:

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

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

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

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

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

    如果是,则在其上运行 getargspec 函数并将结果的参数名称列表添加到初始列表中,跳过 self。

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

    【讨论】:

    • 一些解释会大大增加你的答案的价值:)
    【解决方案2】:

    您可能需要先阅读python Mixins。

    一般来说,使用两个名称冲突的类来使用多重继承是一种非常糟糕的形式。最左边的类总是被优先考虑,这会导致其他类中使用覆盖方法的方法出现一些奇怪的事情。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 2019-09-25
      • 2011-08-09
      相关资源
      最近更新 更多