gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:52:39 26 4
gpt4 key购买 nike

即,如果我有一个 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

有什么想法吗?

编辑:

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

作为sven-marnach注意,我使用的是单参数版本 super(MyClass),而不是更有用的双参数版本 super(MyClass, self)...现在,我不知道为什么我会想要那样做。我最好的猜测是当时我还不清楚 super 的正确用法。

如果您使用的是双参数版本,则第二个检查有效 - 需要注意的是您需要获取 .im_func,即:

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

参见 Determine whether super().__new__ will be object.__new__ in Python 3?举例说明为什么这种检查很有用......

最佳答案

您可以使用提取包装类

mro = my_super.__self_class__.mro()
wrapped_class = mro[mro.index(my_super.__thisclass__) + 1]

这看起来很复杂,但我也认为这样做毫无意义。

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

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

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

关于python - 在 python 中,如何判断 super 对象正在包装哪个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9934254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com