在python中,如何判断超级对象正在包装哪个类?

在python中,如何判断超级对象正在包装哪个类?,python,class,super,Python,Class,Super,也就是说,如果我有一个类MyClass,我执行super(MyClass)。init,我如何知道实际要调用哪个类的init 一些代码可以说明: class MyClass(OtherClass, ThirdClass): def __init__(self): mySuper = super(MyClass) if mySuper == SomeClass: # doesn't work - mySuper is a super ob

也就是说,如果我有一个类MyClass,我执行super(MyClass)。init,我如何知道实际要调用哪个类的init

一些代码可以说明:

class MyClass(OtherClass, ThirdClass):
    def __init__(self):
        mySuper = super(MyClass)
        if mySuper == SomeClass:
           # doesn't work - mySuper is a super object (not a normal class object)
           pass
        if mySuper.__init__ == SomeClass.__init__:
           # doesn't work - mySuper.__init__ is a super-method-wrapper object
           pass
        if mySuper.__thisclass__ == SomeClass:
           # doesn't work - __thisclass__ is set to be MyClass, not the "parent" class
           pass
有什么想法吗

编辑:

如果我还没有在这里获得分数,我可能会删除这个问题,因为它并不是很有用,而且可能会助长坏习惯

如前所述,我使用的是单参数版本,
super(MyClass)
,而不是更有用的双参数版本,
super(MyClass,self)
。。。现在,我不知道我为什么要这么做。我最好的猜测是,当时我还不清楚
super
的正确用法

如果您使用的是两个arg版本,那么第二个检查就起作用了,但需要注意的是,您需要获得
.im_func
,即:

        if mySuper.__init__.im_func == SomeClass.__init__.im_func:

请参阅,以获取此类检查为何有用的示例…

您可以使用

mro = my_super.__self_class__.mro()
wrapped_class = mro[mro.index(my_super.__thisclass__) + 1]
这看起来很复杂,但我也认为这样做是毫无意义的

编辑:我刚刚注意到您没有将
self
传递给
super()
。在这种情况下,你可以使用

wrapped_class = my_super.__thisclass__.mro()[1]

剩下的问题是:为什么要这样做?

在使用多重继承时,可以将
*args
**kwargs
传递给超类“
\uuuu init\uuuu
,该超类可以提取出它想要的参数(将它们命名为参数)。你为什么要这么做?至于为什么-我有一个多重继承的类链。施工人员都支持kwargs。问题是,我有一个类,在一些mro中,有一个super是“object”,而在其他mro中,有另一个我的类是super。我以前总是这样做:super(MyClass,self)。\uuuuu init\uuuugs(**kwargs)…但这现在引发了一个弃用警告,对象不接受args/kwargs。。。顺便提一下我不知道“老”问题的礼仪是什么——我知道在许多论坛上,不鼓励重提老话题。对老问题的答案做标记怎么样?@PaulMolodowitch:正确的处理方法是让每个构造函数使用一个签名,比如
\uuuu init\uuuuu(self,x,y,**kwargs)
,使它从自己使用的参数中弹出,并将
**kwargs
传递给
超级
构造函数。这样,一旦进入
对象
**kwargs
将为空,并且不会出现任何错误消息。有关详细信息,请参阅Raymond Hettinger的“Python的
super()
被认为是超级的”或类似内容–我相信Google会找到link.true,这通常是我处理事情的方式。。。不过,在那个特定的例子中,我相信我是在处理一个现有的代码库,它有一个自定义的
\uuuuu init\uuuuuu
和自定义的
\uuuu new\uuuuuu
。。。并且没有“正确”地从args/kwargs上弹出东西。重写整个类层次结构,使其仅使用
\uuuu new\uuuu
,并确保它弹出kwargs(并正确地测试/调试!),这比我现在有时间做的工作要多。。。