为什么 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 documentation:super()
return 是一个代理对象,而不是您(我假设)期望的 class 基础对象。
您需要访问 super 的 __class__
的事实应该暗示这一点,因为如果 super()
returned 基 class 本身,它已经是一个 class,它不能 return 它的一个实例,因为没有指示会是哪个实例。
我有一个基础 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 documentation:super()
return 是一个代理对象,而不是您(我假设)期望的 class 基础对象。
您需要访问 super 的 __class__
的事实应该暗示这一点,因为如果 super()
returned 基 class 本身,它已经是一个 class,它不能 return 它的一个实例,因为没有指示会是哪个实例。