【问题标题】:Why doesn't super().__class__.__name__ return the name of my base class?为什么 super().__class__.__name__ 不返回我的基类的名称?
【发布时间】:2019-09-23 11:16:18
【问题描述】:

我有一个基类A,我从它继承来创建类B。如果我在类实例上调用名称 dunder,我会得到类的名称。如果我在实例的基类上调用名称 dunder,我会得到基类的名称。到目前为止,这是有道理的。但是,如果在实例的 super() 上调用名称 dunder,我没有得到基类的名称,我不知道为什么。更令人困惑的是,如果我在 supers() 的基类上调用名称 dunder,我会得到基类的正确名称 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”。

【问题讨论】:

    标签: python-3.x super superclass introspection


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      super() 返回一个super 对象。如果您向 Python 询问 __class__super 对象的 __name__,它会告诉您该名称是 super

      参见official documentationsuper() 返回一个代理对象,而不是您(我假设)期望的基类对象。

      您需要访问 super 的 __class__ 的事实应该暗示这一点,因为如果 super() 返回基类本身,它已经是一个类,它不能返回它的实例,因为没有迹象表明会是哪个实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-21
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 2018-11-15
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多