为什么 super().__class__.__name__ return 我的基地名称 class 没有?

Why doesn't super().__class__.__name__ return the name of my base class?

我有一个基础 class A,我继承它来创建 class B。如果我在 class 实例上调用名称 dunder,我会得到 class 的名称。如果我在实例的基础 class 上调用名称 dunder,我会得到基础的名称 class。到目前为止这是有道理的。但是,如果在实例的 super() 上调用名称 dunder,我不会得到基 class 的名称,我不确定为什么。更令人困惑的是,如果我在 supers() 的基 class 上调用名称 dunder,我会得到该基的正确名称 class object.

class A:
    pass


class B(A):
    def __init__(self):
        self.inherited_class_name = self.__class__.__name__
        self.base_class_name = self.__class__.__bases__[0].__name__
        self.should_return_base_class_name = super().__class__.__name__
        self.base_class_base_class = super().__class__.__bases__[0].__name__


if __name__ == '__main__':
    b = B()
    print(b.inherited_class_name)
    print(b.base_class_name)
    print(b.should_return_base_class_name)  # Why does this return "super" instead of "A"?
    print(b.base_class_base_class)  # Especially when this one works...

打印出来

B
A
super 
object

我不明白为什么我的 should_return_base_class_name 调用返回 "super"。

这是因为 super 实际上是一个独特的 class,它抽象出您的基础 class。 super其实不是基数class。当您执行 super() 时,您将获得超级 class 的实例,而不是基础 class.
的实例 如果你在你的例子中尝试 print(super()) 你会得到 <super: <class 'B'>, <B object>>

super() return 一个 super 对象。如果你向 Python 询问 super 对象的 __class____name__,它会告诉你那个名字是 super.

请参阅 official documentationsuper() return 是一个代理对象,而不是您(我假设)期望的 class 基础对象。

您需要访问 super 的 __class__ 的事实应该暗示这一点,因为如果 super() returned 基 class 本身,它已经是一个 class,它不能 return 它的一个实例,因为没有指示会是哪个实例。